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

Код обратной матрицы на С++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 200, средняя оценка - 4.70
Иброхим
Сообщений: n/a
28.10.2008, 18:35     Код обратной матрицы на С++ #1
Мне очень нужен код программы обратной матрицы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Inlight
42 / 41 / 2
Регистрация: 17.09.2008
Сообщений: 98
30.10.2008, 10:26     Код обратной матрицы на С++ #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Завалялся исходник, держи. Поблагодарить незабудь
Вложения
Тип файла: zip Inv.zip (4.1 Кб, 2940 просмотров)
kerim
Сообщений: n/a
02.06.2009, 21:14     Код обратной матрицы на С++ #3
poproshe mojno naiti
Zot 102_rus
Сообщений: n/a
20.11.2009, 18:25     Код обратной матрицы на С++ #4
[ILINK32 Error] Error: Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES (X86)\CODEGEAR\RAD STUDIO\5.0\LIB\CP32MTI.LIB|crtlvcl
[ILINK32 Error] Error: Unresolved external '__ExitVCL' referenced from C:\PROGRAM FILES (X86)\CODEGEAR\RAD STUDIO\5.0\LIB\CP32MTI.LIB|crtlvcl
Как быть с этим помогите плиз
аделя
0 / 0 / 0
Регистрация: 06.06.2010
Сообщений: 7
06.06.2010, 21:00     Код обратной матрицы на С++ #5
даны натуральное число n , целочисленная квадратная матрица порядка n. получить b1,...,bn? где bi это значение первого по порядку положительного элемента i -й строки (если таких элементов нет, то принять bi=1) помогите пожалуйста?))))))
NicholasNoise
Сообщений: n/a
16.10.2010, 23:54     Код обратной матрицы на С++ #6
поделюсь своими трудами...
код "чуть" короче
есть ошибка в функции matr для матрицы размерностью 1 на 1
при желании можете поправить
Вложения
Тип файла: txt A^(-1).txt (2.0 Кб, 1421 просмотров)
vitaska
 Аватар для vitaska
83 / 83 / 2
Регистрация: 04.02.2010
Сообщений: 162
15.03.2011, 11:02     Код обратной матрицы на С++ #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если кому пригодится мой вариант
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 <ctime>
#include <cmath>
 
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(int **matr, int n, int **temp_matr, int indRow, int indCol);
int Det(int **matr, int n);
 
void main()
{
    srand((unsigned)time(NULL));
    setlocale(0, "");
    int n, det;
    cout << "Введите размер матрицы: ";
    cin >> n;
    int **matr = new int * [n];
    double **obr_matr = new double * [n];
    double **tobr_matr = new double * [n];
    for(int i = 0; i < n; i++){
        matr[i] = new int[n];
        obr_matr[i] = new double[n];
        tobr_matr[i] = new double[n];
    }
    SetMtx(matr, n);
    PrintMtx(matr, n);
    det = Det(matr, n);
    cout << "Определитель матрицы = " << det << endl;
    if(det){
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                int m = n - 1;
                int **temp_matr = new int * [m];
                for(int k = 0; k < m; k++)
                    temp_matr[k] = new int[m];
                Get_matr(matr, n, temp_matr, i, j);
                obr_matr[i][j] = pow(-1.0, i + j + 2) * Det(temp_matr, m) / det;
                FreeMem(temp_matr, m);
            }
        }   
    }
    else
        cout << "Т.к. определитель матрицы = 0,\nто матрица вырожденная и обратной не имеет!!!" << endl;
    //Транспонирование матрицы
    TransponMtx(obr_matr, tobr_matr, n);
    //Печать обратной матрицы после транспонирования
    PrintMtx(tobr_matr, n);
    FreeMem(tobr_matr, n);
    FreeMem(matr, n);
    FreeMem(obr_matr, n);
}
//Функция транспонирования матрицы
template <typename T> void TransponMtx(T **matr, T **tMatr, int n){//
    for (int i = 0; i < n; i++) 
        for (int j = 0; j < n; j++)
            tMatr[j][i] = matr[i][j];
}
//Функция освобождения памяти
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)
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            matr[i][j] = rand()%9 + 1; 
}
 
//функция печати матрицы
template <typename T> void PrintMtx(T **matr, int n)
{
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++)
            cout << matr[i][j] << " ";
        cout << endl; 
    }
}
//функция вычеркивания строки и столбца
void Get_matr(int **matr, int n, int **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++;       
        }
    }
}
 
//==============================================================================================================
//                              вычисление определителя
//==============================================================================================================
//функция вычисления определителя матрицы
int Det(int **matr, int n)  
{
    int 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; 
            int **temp_matr = new int * [m];
            for(int j = 0; j < m; j++)
                temp_matr[j] = new int [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;
}
Olechka1991
1 / 1 / 0
Регистрация: 28.06.2011
Сообщений: 90
13.11.2011, 09:44     Код обратной матрицы на С++ #8
обращение матрицы
Вложения
Тип файла: rar inverse.rar (390.9 Кб, 875 просмотров)
tymrfik
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
09.01.2012, 21:28     Код обратной матрицы на С++ #9
vitaska, Подскажите пожалуйста в чем ошибка: в моем случае в программе нужно рассчитать обратную матрицу для матрицы размером 30*30 (матрица состоит из 1 и 0 в определенном порядке, обратная точно существует), я позаимствовал только часть вашего кода, но почему-то у меня даже определитель не считается (при компиляции проблем нет)
Взял след. части:
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
//
void Get_matr(int **matr, int n, int **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++;           
                }
        }
}
int Det(int **matr, int n)      
{int temp = 0;   
        int k = 1;             
                for(int i = 0; i < n; i++){
                        int m = n - 1; 
                        int **temp_matr = new int * [m];
                        for(int j = 0; j < m; j++)
                                temp_matr[j] = new int [m];
                        Get_matr(matr, n, temp_matr, 0, i);
                        temp = temp + k * matr[0][i] * Det(temp_matr, m);
                        k = -k;
        
                }
        return temp;
}
//в самой функции int main() начинаю транспонировать матрицу и делать вычисление обратной. //(идет кусок main)
  for (int i = 0; i < 30; i++){ 
        for (int j = 0; j <30; j++){
            tMatr[j][i] = c[i][j];
            }
            }
 
  double **obr_matr = new double * [n];
        for(int i = 0; i < n; i++){
                obr_matr[i] = new double[n];}
int det = Det(c, n);
      cout << "вывод определителя"<< det << endl;
            if(det){
                for(int i = 0; i < n; i++){
                        for(int j = 0; j < n; j++){
                                int m = n - 1;
                                int **temp_matr = new int * [m];
                                for(int k = 0; k < m; k++)
                                        temp_matr[k] = new int[m];
                                Get_matr(c, n, temp_matr, i, j);
                                obr_matr[i][j] = pow(-1.0, i + j + 2) * Det(temp_matr, m) / det;
                                }
                }       
        }
 
for(i=0;i<30;i++){
   for(j=0;j<30;j++)                          
      printf("%d ", obr_matr[i][j]);
    printf("\n");
}
(беру не весь код, потому что задание у меня заключается в др, но для работы в программе нужна эта обратная матрица)

Добавлено через 2 минуты
Кто может подскажите в чем ошибка у меня?!
vitaska
 Аватар для vitaska
83 / 83 / 2
Регистрация: 04.02.2010
Сообщений: 162
14.01.2012, 13:29     Код обратной матрицы на С++ #10
Цитата Сообщение от tymrfik Посмотреть сообщение
я позаимствовал только часть вашего кода, но почему-то у меня даже определитель не считается (при компиляции проблем нет)
предполагаю, что вы слишком много кода выборосили в функции вычисления определителя предложенного мной. попробуйте написать вот так:
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
int Det(int **matr, int n)      
{
        int temp = 0;   //временная переменная для хранения определителя
        int k = 1;              //степень
        if(n < 1)
            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; 
                        int **temp_matr = new int * [m];
                        for(int j = 0; j < m; j++)
                                temp_matr[j] = new int [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;
}
проверить не могу ибо не дома. пробуйте, но по идее теперь должен высчитать
vanomux
3 / 3 / 0
Регистрация: 08.02.2012
Сообщений: 17
08.02.2012, 17:42     Код обратной матрицы на С++ #11
можно отсюда взять вроде работает
http://algorithmlib.org/gauss_inverse
или
http://algorithmlib.org/lu_inverse
Eternal_Sunrise
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 18
21.03.2013, 17:19     Код обратной матрицы на С++ #12
Цитата Сообщение от vitaska Посмотреть сообщение
Если кому пригодится мой вариант
спасибо большое! но по какому тут принципу производиться вычисление обратной матрицы? подскажите пжлста!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2015, 14:44     Код обратной матрицы на С++
Еще ссылки по теме:

C++ Метод обратной матрицы
C++ Нахождение обратной матрицы
C++ Нахождение обратной матрицы

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

Или воспользуйтесь поиском по форуму:
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,586
12.11.2015, 14:44     Код обратной матрицы на С++ #13
Программа из второго сообщения кривовата: память утекает - деструктора нет, и при получении обратной матрицы нет транспонирования.
Yandex
Объявления
12.11.2015, 14:44     Код обратной матрицы на С++
Ответ Создать тему
Опции темы

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