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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 200, средняя оценка - 4.70
Иброхим
Сообщений: n/a
#1

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

28.10.2008, 18:35. Просмотров 30139. Ответов 12
Метки нет (Все метки)

Мне очень нужен код программы обратной матрицы.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2008, 18:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Код обратной матрицы на С++ (C++):

Код обратной матрицы и перемножения матрицна с++ - C++
Нужен код для нахождения обратной матрицы. Желательно с импортом коэффициентов и тхт. Так же нужен код для перемножения матриц. Заранее...

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

Дан алгоритм нахождения обратной матрицы. По нему хочу написать код. Но непонятно по какому методу он работает. - C++
Сам алгоритм: (Вложенный файл) Помогите пожалуйста разобраться по какому алгебраическому методу он работает. Не могу понять где...

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

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

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

12
Inlight
43 / 42 / 2
Регистрация: 17.09.2008
Сообщений: 98
30.10.2008, 10:26 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Завалялся исходник, держи. Поблагодарить незабудь
15
Вложения
Тип файла: zip Inv.zip (4.1 Кб, 3171 просмотров)
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) помогите пожалуйста?))))))
0
NicholasNoise
Сообщений: n/a
16.10.2010, 23:54 #6
поделюсь своими трудами...
код "чуть" короче
есть ошибка в функции matr для матрицы размерностью 1 на 1
при желании можете поправить
Вложения
Тип файла: txt A^(-1).txt (2.0 Кб, 1537 просмотров)
vitaska
85 / 85 / 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;
}
6
Olechka1991
1 / 1 / 0
Регистрация: 28.06.2011
Сообщений: 90
13.11.2011, 09:44 #8
обращение матрицы
1
Вложения
Тип файла: rar inverse.rar (390.9 Кб, 981 просмотров)
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 минуты
Кто может подскажите в чем ошибка у меня?!
0
vitaska
85 / 85 / 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;
}
проверить не могу ибо не дома. пробуйте, но по идее теперь должен высчитать
1
vanomux
3 / 3 / 0
Регистрация: 08.02.2012
Сообщений: 17
08.02.2012, 17:42 #11
можно отсюда взять вроде работает
http://algorithmlib.org/gauss_inverse
или
http://algorithmlib.org/lu_inverse
0
Eternal_Sunrise
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 18
21.03.2013, 17:19 #12
Цитата Сообщение от vitaska Посмотреть сообщение
Если кому пригодится мой вариант
спасибо большое! но по какому тут принципу производиться вычисление обратной матрицы? подскажите пжлста!
0
nmcf
5348 / 4668 / 1561
Регистрация: 14.04.2014
Сообщений: 18,582
12.11.2015, 14:44 #13
Программа из второго сообщения кривовата: память утекает - деструктора нет, и при получении обратной матрицы нет транспонирования.
0
12.11.2015, 14:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2015, 14:44
Привет! Вот еще темы с ответами:

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

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

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

Поиск обратной матрицы - C++
Дана ленточная разреженная матрица. Найти обратную. Знаю, что это тема есть на форуме, но ответа так и не было. Может кто-нибудь на...


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

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

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