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

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

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

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

12.04.2013, 01:10. Просмотров 348. Ответов 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;
        }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2013, 01:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблемы с классами при поиске обратной матрицы (C++):

Умножение матрицы на матрицу, и нахождение обратной матрицы - C++
Здравствуйте! нужно написать программу, которая могла бы производить всякие операции над матрицами (двухмерными массивами) меня...

Пояснение строчки кода в поиске определителя (детерменанта) матрицы - C++
В данной теме мне не понятна эта строчка кода: det+=pow((double)-1, (i+j))*determ(matr, size-1)*Arr; А именно вот это: determ(matr,...

Нахождение обратной матрицы - C++
Помогите,пожалуйста доделать или переделать нужно найти обратную матрицу тут маленько наброски есть методом гаусса но не могу доделать или...

Код обратной матрицы на С++ - C++
Мне очень нужен код программы обратной матрицы.

Определение обратной матрицы - C++
Помогите, задали в универе написать программку в С++ по определении обратной матрицы, циклический алгоритм

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
12.04.2013, 11:27 #2
Seemann92, попробуйте ввести новую переменную для обратной матрицы, а то она обновляет сама себя.
0
Seemann92
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 45
12.04.2013, 17:32  [ТС] #3
sl_k, как я понял, в этом-то и суть метода. Одни и те же операции должны проводиться над исходной матрицей и единичной матрицей того же размера.
0
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
12.04.2013, 18:45 #4
Seemann92, c диагональной матрицей 3х3 метод работает. можете дать свой пример, на котором тестировали. ваш результат, и что должно получиться.
0
Seemann92
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 45
12.04.2013, 18:54  [ТС] #5
sl_k, я генерировал матрицы с помощью рандома, запускал расчёт обратной матрицы. Результаты сверял с решениями на онлайн ресурсах. У такой же программы, реализованной без классов, решение совпадало с решением на сайте. У данного примера - нет.
0
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
1
Seemann92
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 45
12.04.2013, 19:33  [ТС] #7
sl_k, а вот и оно! Тестируя свою версию программы, сначала вызывал метод Opr() для расчёта определителя. Как видно из кода, метод вносил некоторое коррективы в исходную матрицу. Ваш самый первый совет о новой переменной был верен, но в отношении другого метода. Спасибо. Буду исправлять.
0
vanomux
3 / 3 / 0
Регистрация: 08.02.2012
Сообщений: 17
18.04.2013, 23:09 #8
возьми здесь вроде работает http://algorithmlib.org/gauss_inverse - обратная матрица, http://algorithmlib.org/gauss_det - определитель матрицы
1
Seemann92
5 / 5 / 0
Регистрация: 12.04.2013
Сообщений: 45
18.04.2013, 23:38  [ТС] #9
vanomux, да и этот уже отладил. Спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2013, 23:38
Привет! Вот еще темы с ответами:

Метод обратной матрицы - C++
Необходимо добавить метод нахождения обратной матрицы #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() ...

Нахождение обратной матрицы - C++
Доброго времени суток! Возникла необходимость найти обратную матрицу любым из способов, так как в программировании только делаю первые...

Нахождение обратной матрицы - C++
Доброго времени суток! Напишите, пожалуйста, кому не сложно, простой, понятный код нахождения обратной матрицы. Буду очень признателен!

Метод обратной матрицы - C++
Я писал свою программу давно на Паскале.. щас же мне она нужна на языке С++... може кто поможет перевести на С? заранее спасибо...всех с...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.04.2013, 23:38
Ответ Создать тему
Опции темы

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