Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
22.07.2011, 13:37     Почему то не могу считать матрицу #1
Есть матрица порядка 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
Вложения
Тип файла: 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++ считать матрицу из текстового файла
C++ считать матрицу с файла
Нужно считать матрицу C++
считать матрицу C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Глупец
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)
что делает эта функция, и где собственно само тарнспонирование?))
да и чтобы транспонировать матрицу достаточно построчно считывая первую по столбцам в порядке получения записывать вторую вроде как...
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
22.07.2011, 15:19  [ТС]     Почему то не могу считать матрицу #3
В комменте к ф-ции прекрасно написано, что она делает.
И зачем транспонирование то?
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
22.07.2011, 15:29     Почему то не могу считать матрицу #4
Какой конфуз(
Прошу прощения, надеюсь ник меня оправдает-линейка ох как давно была...подзабыл)
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
22.07.2011, 15:32  [ТС]     Почему то не могу считать матрицу #5
Там какой то странный баг. Не понимаю в чем косяк. Явно не в алгоритме косяк.
Все работает отлично на маленьких матрицах. на больших - облом(
Глупец
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,или если хочешь могу дать свой...

да и чтоб код был по быстрее не нужно выделять память под временный массивы внутри цикла работабщего с ними, как минимум...
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
22.07.2011, 16:04  [ТС]     Почему то не могу считать матрицу #7
Было б неплохо, если б свой дал.
Сам не в восторге от того, что там рекусия....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2011, 16:21     Почему то не могу считать матрицу
Еще ссылки по теме:

C++ Не могу считать матрицу из файла в динамический массив
Считать матрицу из Excel C++
C++ Считать матрицу в динамический массив

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

Или воспользуйтесь поиском по форуму:
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
22.07.2011, 16:21     Почему то не могу считать матрицу #8
Я не знаю как тут цеплять, по этому держи так)))
http://zalil.ru/upload/31454309
Yandex
Объявления
22.07.2011, 16:21     Почему то не могу считать матрицу
Ответ Создать тему
Опции темы

Текущее время: 18:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru