Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
#1

Почему то не могу считать матрицу - C++

22.07.2011, 13:37. Просмотров 512. Ответов 7
Метки нет (Все метки)

Есть матрица порядка 3638. Мне нужно найти обратную к ней. ( В последствии порядок матрицы будет около 100 000)
Есть код, вот только он не совсем рабочий. На маленьких матрицах порядка 3-4 он работает отлично, а вот на матрице порядка 3638 - не работает. В качестве результата выдает исходную матрицу.
Помогите найти косяк. И по возможности сделать код "по-шустрее"
Вот код на С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <sstream>
#include <vector>
#include <string>
#include <ctime>
#include <cmath>
#include <math.h>
#include <conio.h>
 
using namespace std;
 
template <typename T> void FreeMem(T **matr, int n);
template <typename T> void PrintMtx(T **matr, int n);
template <typename T> void SetMtx(T **matr, int n);
template <typename T> void TransponMtx(T **matr, T **tMatr, int n);
void Get_matr(double **matr, int n, double **temp_matr, int indRow, int indCol);
double Det(double **matr, int n);
 
void main()
{
    srand((unsigned)time(NULL));
    setlocale(0, "");
    int n; 
    double det;
    cout << "Введите размер матрицы: ";
    cin >> n;
    double **matr = new double * [n];
    double **obr_matr = new double * [n];
    for(int i = 0; i < n; i++)
        {
            matr[i] = new double[n];
            obr_matr[i] = new double[n];
        }
    
        SetMtx(matr, n);
        det = Det(matr, n);
        if(det != 0 ){
                for(int i = 0; i < n; i++){
                        for(int j = 0; j < n; j++){
                                int m = n - 1;
                                double **temp_matr = new double * [m];
                                for(int k = 0; k < m; k++)
                                        temp_matr[k] = new double[m];
                                Get_matr(matr, n, temp_matr, i, j);
                                obr_matr[j][i] = pow(-1.0, i + j + 2) * Det(temp_matr, m) / det;
                                FreeMem(temp_matr, m);
                        }
                }       
        }
        else
  cout << "Т.к. определитель матрицы = 0,\nто матрица вырожденная и обратной не имеет!!!" << endl;
        //Печать матрицы
        PrintMtx(obr_matr, n);
        // Освобождение памяти
        FreeMem(matr, n);
        FreeMem(obr_matr, n);
}
//Функция освобождения памяти
template <typename T> void FreeMem(T **matr, int n)
{
        for(int i = 0; i < n; i++)
                delete [] matr[i];
        delete [] matr;
}
 
//функция заполнения матрицы
template <typename T> void SetMtx(T **matr, int n)
{
    ifstream ifs1("1.txt");
        for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                {
                    ifs1 >> matr[i][j];
                }
}
 
//функция печати матрицы
template <typename T> void PrintMtx(T **matr, int n)
{
    ofstream ofs4("2.txt");
        for (int i = 0; i < n; i++){
                for (int j = 0; j < n; j++)
                    ofs4 << matr[i][j] << " ";
                ofs4 << endl;
        }  
}
 
//функция вычеркивания строки и столбца
void Get_matr(double **matr, int n, double **temp_matr, int indRow, int indCol)       
{
        int ki = 0; 
        for (int i = 0; i < n; i++){
                if(i != indRow){
                        for (int j = 0, kj = 0; j < n; j++){
                                if (j != indCol){
                                        temp_matr[ki][kj] = matr[i][j];
                                        kj++;
                                }
                        }
                        ki++;           
                }
        }
}
 
 //функция вычисления определителя матрицы
double Det(double **matr, int n)      
{
        double temp = 0;   //временная переменная для хранения определителя
        int k = 1;              //степень
        if(n < 1){
                cout<<"Неверный размер матрицы!!!" << endl;
        return 0;
    }
        else if (n == 1)
                temp = matr[0][0];
        else if (n == 2)
                temp = matr[0][0] * matr[1][1] - matr[1][0] * matr[0][1];
        else{
                for(int i = 0; i < n; i++){
                        int m = n - 1; 
                        double **temp_matr = new double * [m];
                        for(int j = 0; j < m; j++)
                                temp_matr[j] = new double [m];
                        Get_matr(matr, n, temp_matr, 0, i);
                        temp = temp + k * matr[0][i] * Det(temp_matr, m);
                        k = -k;
                        FreeMem(temp_matr, m);
                }
        }
        return temp;
}
Сами матрицы находятся в текстовых файлах. Прикрепил и их:
1.txt - матрица порядка 4 (пробная)
2.txt - сюда записывается результат работы программы
3.txt - матрица порядка 3638
0
Вложения
Тип файла: txt 1.txt (23 байт, 14 просмотров)
Тип файла: txt 2.txt (51 байт, 10 просмотров)
Тип файла: rar 3.rar (69.5 Кб, 11 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2011, 13:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему то не могу считать матрицу (C++):

Не могу считать матрицу из файла в динамический массив - C++
Вот проблемный кусок программы: fstream f (strConst); if (! f) { cout&lt;&lt;&quot;Error_3&quot;; return 1; } int...

считать матрицу - C++
Помогите пожалуйста! В файле дана такая инфа 4н 66 3 4 кк 44 9 4 4 5 нужно считать матрицу такого вида 4 66 3 4 44 9 4 4 5 ...

Считать матрицу из файла - C++
код на си вроде,сколько смотрела по форумам, код правильный грешу на ввод размерности с клавиатуры выводит матрицу заполненную нулями...

Считать матрицу из файла - C++
Как считать размерность матрицы и затем саму матрицу из файла? Добавлено через 52 минуты 53 секунды HELP!!!!!!!!!!!!!!!!!:help:

считать матрицу с файла - C++
Матрица имеет такой вид, плз помогите написать код считывания с файла! заранее спасибо и файл я думаю желательно передавать как аргумент))...

Нужно считать матрицу - C++
Доброго времени суток! Тут такая проблема. У меня есть файл txt, в котором коэффициенты матрицы расположены так: 1 4 2 1 3 6 1...

7
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
22.07.2011, 15:11 #2
Цитата Сообщение от hello19 Посмотреть сообщение
//функция вычеркивания строки и столбца
void Get_matr(double **matr, int n, double **temp_matr, int indRow, int indCol)
что делает эта функция, и где собственно само тарнспонирование?))
да и чтобы транспонировать матрицу достаточно построчно считывая первую по столбцам в порядке получения записывать вторую вроде как...
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
22.07.2011, 15:19  [ТС] #3
В комменте к ф-ции прекрасно написано, что она делает.
И зачем транспонирование то?
0
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
22.07.2011, 15:29 #4
Какой конфуз(
Прошу прощения, надеюсь ник меня оправдает-линейка ох как давно была...подзабыл)
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
22.07.2011, 15:32  [ТС] #5
Там какой то странный баг. Не понимаю в чем косяк. Явно не в алгоритме косяк.
Все работает отлично на маленьких матрицах. на больших - облом(
0
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
22.07.2011, 16:02 #6
Эм, ну считывается она у тебя вроде нормально, а вот на поиске определителя мне сказали пойти выйти:
"Введите размер матрицы: 3638
Считана!

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Для продолжения нажмите любую клавишу . . ."

так вот это скорее всего(а возможно даже точно) из-за переполнения стэка...ведь
C++
1
double Det(double **matr, int n)
рекурсивная...
попробуй написать свой стэк, или изучить list.h,или если хочешь могу дать свой...

да и чтоб код был по быстрее не нужно выделять память под временный массивы внутри цикла работабщего с ними, как минимум...
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
22.07.2011, 16:04  [ТС] #7
Было б неплохо, если б свой дал.
Сам не в восторге от того, что там рекусия....
0
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
22.07.2011, 16:21 #8
Я не знаю как тут цеплять, по этому держи так)))
http://zalil.ru/upload/31454309
0
22.07.2011, 16:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2011, 16:21
Привет! Вот еще темы с ответами:

Считать матрицу из Excel - C++
то есть мне нужна матрицу считывал в с++ помогите

Считать данные в матрицу из файла - C++
(С/С++)Как считать матрицу из файла и записать в массив. Файл содержит такой вид: 2 3 23 -4 0 -3 2 1 43

Считать матрицу в динамический массив - C++
Есть функция для статического массива, как ее переделать в динамический? в файле матрица: 4 4 4 4 4 4 4 4 4 4 4 4...

Считать матрицу из текстового файла - C++
в текстовом файле дана матрица 4 9 5 5 9 2 9 2 9 как считать этот двумерный массив и вывести его на экран? подскажите плиз(c++)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru