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

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

Войти
Регистрация
Восстановить пароль
 
Seemann92
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 45
#1

Проблемы с классами при поиске обратной матрицы - C++

12.04.2013, 01:10. Просмотров 334. Ответов 8
Метки нет (Все метки)

Доброго времени суток!
Задача такова. Необходимо создать класс, который создавал бы матрицу заданного размера (квадратную), рассчитывал её определитель и находил обратную матрицу.
Нашёл необходимые функции здесь и вот здесь. После того, как вставил код в описание класса, обратная матрица стала рассчитываться некорректно. Тестировал на матрице размером 3х3. Последний столбец рассчитывается правильно, остальные нет. Если прописать данный код вне класса (причём и создание матрицы тоже), всё работает как надо. Подскажите, пожалуйста, в чём здесь проблема.

Класс СMatrix:
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
#define R 9
 
class CMatrix{
double mas[R][R], E[R][R];
double kst, temp;
int n, p, t;
public:
        CMatrix(int);
        int Opr();
        void Inversion();
};
 
CMatrix::CMatrix(int N){
        n=N;
        randomize();
        cout<<"Ishodnaya matriza: "<<endl;
        for (int i=0; i<n; i++){
                for (int j=0; j<n; j++){
                        mas[i][j]=random(100);
                        cout<<mas[i][j]<<"\t";
                }
                cout<<endl;
        }
        cout<<endl;
}
 
int CMatrix::Opr(){
        p=0;
    for (int i=0; i<n-1; i++){
        t=1;
        while(mas[i][i]==0){
            for(int j=0; j<n; j++){
                mas[i][j]=kst;
                mas[i][j]=mas[i+t][j];
                mas[i+t][j]=kst;
            }
            p++;
            t++;
        }
        for (int k=i+1; k<n; k++){
            kst=mas[k][i]/mas[i][i];
            for(int j=0; j<n; j++)
                mas[k][j]-=mas[i][j]*kst;
        }
    }
    kst=pow(-1.0, p);
    for(int i=0; i<n; i++)
        kst*=mas[i][i];
    cout<<"Opredelitel': "<<kst;
        if (kst) return 1;
        else return 0;
}
 
void CMatrix::Inversion(){
        for (int i=0; i<n; i++)
                for (int j=0; j<n; j++){
                        if (i==j) E[i][j]=1.0;
                        else E[i][j]=0.0;
                }
        for (int k=0; k<n; k++){
                temp=mas[k][k];
                for (int j=0; j<n; j++){
                        mas[k][j]/=temp;
                        E[k][j]/=temp;
                }
                for (int i=k+1; i<n; i++){
                        temp=mas[i][k];
                        for (int j=0; j<n; j++){
                                mas[i][j]-=mas[k][j]*temp;
                                E[i][j]-=E[k][j]*temp;
                        }
                }
        }
        for (int k=n-1; k>0; k--){
                for (int i=k-1; i>=0; i--){
                        temp=mas[i][k];
                        for (int j=0; j<n; j++){
                                mas[i][j]-=mas[k][j]*temp;
                                E[i][j]-=E[k][j]*temp;
                        }
                }
        }
        cout<<endl<<"Obratnaya matriza:\n";
        for (int i=0; i<n; i++){
                for (int j=0; j<n; j++)
                        cout<<E[i][j]<<"\t";
                cout<<endl;
        }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
12.04.2013, 11:27     Проблемы с классами при поиске обратной матрицы #2
Seemann92, попробуйте ввести новую переменную для обратной матрицы, а то она обновляет сама себя.
Seemann92
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 45
12.04.2013, 17:32  [ТС]     Проблемы с классами при поиске обратной матрицы #3
sl_k, как я понял, в этом-то и суть метода. Одни и те же операции должны проводиться над исходной матрицей и единичной матрицей того же размера.
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
12.04.2013, 18:45     Проблемы с классами при поиске обратной матрицы #4
Seemann92, c диагональной матрицей 3х3 метод работает. можете дать свой пример, на котором тестировали. ваш результат, и что должно получиться.
Seemann92
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 45
12.04.2013, 18:54  [ТС]     Проблемы с классами при поиске обратной матрицы #5
sl_k, я генерировал матрицы с помощью рандома, запускал расчёт обратной матрицы. Результаты сверял с решениями на онлайн ресурсах. У такой же программы, реализованной без классов, решение совпадало с решением на сайте. У данного примера - нет.
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
12.04.2013, 19:00     Проблемы с классами при поиске обратной матрицы #6
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
#include<iostream>
#include<cmath>
using namespace std;
 
#define R 3
 
class CMatrix{
double mas[R][R], E[R][R];
double kst, temp;
int n, p, t;
public:
        CMatrix(int);
        int Opr();
        void Inversion();
};
 
CMatrix::CMatrix(int N){
        n=N;
 
        cout<<"Ishodnaya matriza: "<<endl;
        mas[0][0] = 2; mas[0][1] = 1; mas[0][2] = -1;
         mas[1][0] = 5; mas[1][1] = 2; mas[1][2] = 4;
          mas[2][0] = 7; mas[2][1] = 3; mas[2][2] = 2;
        
        
        for (int i=0; i<n; i++){
           for (int j=0; j<n; j++){
 
                cout<<mas[i][j]<< " ";
           }
 
       
        cout<<endl;
        }
}
 
int CMatrix::Opr(){
        p=0;
    for (int i=0; i<n-1; i++){
        t=1;
        while(mas[i][i]==0){
            for(int j=0; j<n; j++){
                mas[i][j]=kst;
                mas[i][j]=mas[i+t][j];
                mas[i+t][j]=kst;
            }
            p++;
            t++;
        }
        for (int k=i+1; k<n; k++){
            kst=mas[k][i]/mas[i][i];
            for(int j=0; j<n; j++)
                mas[k][j]-=mas[i][j]*kst;
        }
    }
    kst=pow(-1.0, p);
    for(int i=0; i<n; i++)
        kst*=mas[i][i];
    cout<<"Opredelitel': "<<kst;
        if (kst) return 1;
        else return 0;
}
 
void CMatrix::Inversion(){
        for (int i=0; i<n; i++)
                for (int j=0; j<n; j++){
                        if (i==j) E[i][j]=1.0;
                        else E[i][j]=0.0;
                }
        for (int k=0; k<n; k++){
                temp=mas[k][k];
                for (int j=0; j<n; j++){
                        mas[k][j]/=temp;
                        E[k][j]/=temp;
                }
                for (int i=k+1; i<n; i++){
                        temp=mas[i][k];
                        for (int j=0; j<n; j++){
                                mas[i][j]-=mas[k][j]*temp;
                                E[i][j]-=E[k][j]*temp;
                        }
                }
        }
        for (int k=n-1; k>0; k--){
                for (int i=k-1; i>=0; i--){
                        temp=mas[i][k];
                        for (int j=0; j<n; j++){
                                mas[i][j]-=mas[k][j]*temp;
                                E[i][j]-=E[k][j]*temp;
                        }
                }
        }
        cout<<endl<<"Obratnaya matriza:\n";
        for (int i=0; i<n; i++){
                for (int j=0; j<n; j++)
                        cout<<E[i][j]<<"\t";
                cout<<endl;
        }
}
 
 
int main(){
   CMatrix matrix(3);
   matrix.Inversion();
   return 0;
}

и этот код работает. Проверил тут в примере 2.11 http://www.mathelp.spb.ru/book1/omatrix.htm
Seemann92
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 45
12.04.2013, 19:33  [ТС]     Проблемы с классами при поиске обратной матрицы #7
sl_k, а вот и оно! Тестируя свою версию программы, сначала вызывал метод Opr() для расчёта определителя. Как видно из кода, метод вносил некоторое коррективы в исходную матрицу. Ваш самый первый совет о новой переменной был верен, но в отношении другого метода. Спасибо. Буду исправлять.
vanomux
3 / 3 / 0
Регистрация: 08.02.2012
Сообщений: 17
18.04.2013, 23:09     Проблемы с классами при поиске обратной матрицы #8
возьми здесь вроде работает http://algorithmlib.org/gauss_inverse - обратная матрица, http://algorithmlib.org/gauss_det - определитель матрицы
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2013, 23:38     Проблемы с классами при поиске обратной матрицы
Еще ссылки по теме:

C++ Нахождение обратной матрицы
Нахождение обратной матрицы C++
C++ Нахождение обратной матрицы
Пояснение строчки кода в поиске определителя (детерменанта) матрицы C++
C++ Поиск обратной матрицы

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

Или воспользуйтесь поиском по форуму:
Seemann92
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 45
18.04.2013, 23:38  [ТС]     Проблемы с классами при поиске обратной матрицы #9
vanomux, да и этот уже отладил. Спасибо.
Yandex
Объявления
18.04.2013, 23:38     Проблемы с классами при поиске обратной матрицы
Ответ Создать тему
Опции темы

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