Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/776: Рейтинг темы: голосов - 776, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 1

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

28.10.2008, 18:35. Показов 152983. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне очень нужен код программы обратной матрицы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2008, 18:35
Ответы с готовыми решениями:

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

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

Нахождение обратной матрицы
Здравствуйте!помогите с программой на языке си-она демонстрирует нахождение обратной матрицы.я написал 3 на 3 юно мне надо в начале проги...

17
50 / 49 / 15
Регистрация: 17.09.2008
Сообщений: 98
30.10.2008, 10:26
Лучший ответ Сообщение было отмечено как решение

Решение

Завалялся исходник, держи. Поблагодарить незабудь
Вложения
Тип файла: zip Inv.zip (4.1 Кб, 6724 просмотров)
22
kerim
02.06.2009, 21:14
poproshe mojno naiti
Zot 102_rus
20.11.2009, 18:25
[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
даны натуральное число n , целочисленная квадратная матрица порядка n. получить b1,...,bn? где bi это значение первого по порядку положительного элемента i -й строки (если таких элементов нет, то принять bi=1) помогите пожалуйста?))))))
0
NicholasNoise
16.10.2010, 23:54
поделюсь своими трудами...
код "чуть" короче
есть ошибка в функции matr для матрицы размерностью 1 на 1
при желании можете поправить
Вложения
Тип файла: txt A^(-1).txt (2.0 Кб, 3034 просмотров)
 Аватар для vitaska
101 / 101 / 15
Регистрация: 04.02.2010
Сообщений: 162
15.03.2011, 11:02
Лучший ответ Сообщение было отмечено как решение

Решение

Если кому пригодится мой вариант
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;
}
18
1 / 1 / 0
Регистрация: 28.06.2011
Сообщений: 90
13.11.2011, 09:44
обращение матрицы
Вложения
Тип файла: rar inverse.rar (390.9 Кб, 1951 просмотров)
1
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
09.01.2012, 21:28
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
101 / 101 / 15
Регистрация: 04.02.2010
Сообщений: 162
14.01.2012, 13:29
Цитата Сообщение от 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;
}
проверить не могу ибо не дома. пробуйте, но по идее теперь должен высчитать
2
3 / 3 / 0
Регистрация: 08.02.2012
Сообщений: 17
08.02.2012, 17:42
можно отсюда взять вроде работает
http://algorithmlib.org/gauss_inverse
или
http://algorithmlib.org/lu_inverse
0
0 / 0 / 0
Регистрация: 14.02.2013
Сообщений: 18
21.03.2013, 17:19
Цитата Сообщение от vitaska Посмотреть сообщение
Если кому пригодится мой вариант
спасибо большое! но по какому тут принципу производиться вычисление обратной матрицы? подскажите пжлста!
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
12.11.2015, 14:44
Программа из второго сообщения кривовата: память утекает - деструктора нет, и при получении обратной матрицы нет транспонирования.
0
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 1
19.05.2018, 16:31
Спасибо большущее, очень наглядная прога !!!
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 120
08.05.2020, 11:06
Здравствуйте! Подскажите пожалуйста как, или что нужно исправить в моём коде, я пишу программу которая подносит матрицу в n-ю степень, в среде с++ builder, для ввода и вывода использую компонент StringGrid, думал зациклить умножение матриц, но что-то считает не то, в квадрат отлично подносит а куб и так далее нет, буду признателен если Вы поделитесь опытом, и подскажите что нужно исправить.
Вот мой код:
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
void __fastcall TForm7::Button1Click(TObject *Sender)
{
  int row1, col1, n;
  int **a,  **c,**d;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
 
  row1 = StrToInt(Edit2->Text);
  col1 = StrToInt(Edit3->Text);
 
  n = StrToInt(Edit1->Text); // ввод степени матрицы 
 
 
 
    // Ввод елементов матрицы
     a = new int*[row1];
     for(int i = 0; i < row1; i++)
      {
        a[i] = new int[col1];
        for(int j = 0; j < col1; j++)
         {
           a[i][j] = StrToInt(SG1->Cells[j][i]);
          }
        }
 for(int b = 0; b < n; b++)
  {
      // умножение матриц 
     for(int l = 1; l < n; l++)
     {
      c = new int*[row1];
      for(int i = 0; i < row1; i++)
       {
         c[i] = new int[col1];
         //d[i] = new int[col1];
         for(int j = 0; j < col1; j++)
          {
            c[i][j] = 0;
            for(int k = 0; k < col1; k++)
             {
               c[i][j] += a[i][k] * a[k][j];
 
             }
            }
         }
 
        // вывод ответа
        for(int i = 0; i < row1; i++)
         {
            for(int j = 0; j < col1; j++)
             {
               SG2->Cells[j][i] = c[i][j];
              }
         }
 
  }
  }
 
 }
Заранее спасибо Вам.
0
0 / 0 / 0
Регистрация: 03.02.2021
Сообщений: 2
03.02.2021, 16:17
Здравствуйте!
Скачала предложенный выше код inverse.rar.
Использую библиотеку , считаю для матрицы размером 10Х10.
Обратная матрица в 9 строках совпадает с матлабом , а в 10 нет.
В десятой строке какие то числа огромные
Помогите разобраться, пожалуйста
0
0 / 0 / 0
Регистрация: 14.03.2018
Сообщений: 120
03.02.2021, 18:39
Цитата Сообщение от Olga_vlas Посмотреть сообщение
Здравствуйте!
Скачала предложенный выше код inverse.rar.
Использую библиотеку , считаю для матрицы размером 10Х10.
Обратная матрица в 9 строках совпадает с матлабом , а в 10 нет.
В десятой строке какие то числа огромные
Помогите разобраться, пожалуйста

Здравствуйте, я когда то делал похожее
Вот код:

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
void __fastcall TForm8::Button1Click(TObject *Sender)
{
  N = StrToInt(Edit1->Text);
 
  for(i = 0; i < N; i++)
  {
   for(j = 0; j < N; j++)
   {
     mat[i][j] = StrToInt(SG1->Cells[j][i]);
   }
  }
  if(N > 2)
  {
   for(i = 0; i < N; i++)
   {
    determinant = determinant + (mat[0][i] * (mat[1][(i+1)%N] * mat[2][(i+2)%N] - mat[1][(i+2)%N] * mat[2][(i+1)%N]));
    Label5->Caption = determinant;
   }
  }
  if(N==2)
  {
   determinant = mat[0][0] * mat [1][1]  - mat [0][1] * mat [1][0];
   Label5->Caption = determinant;
  }
  if(N==1)
  {
   determinant = mat[0][0];
  }
  if(determinant != 0)
  {
   for(i = 0; i < N; i++)
   {
    for(j = 0; j < N; j++)
    {
     SG2->Cells[j][i] = ((mat[(j+1)%N][(i+1)%N] * mat[(j+2)%N][(i+2)%N]) - (mat[(j+1)%N][(i+2)%N] * mat[(j+2)%N][(i+1)%N]))/ determinant;
    }
   }
  }
  else
  {
   ShowMessage("Обратной матрицы не существует!");
  }
 
 
}
Надеюсь Вам это поможет
0
0 / 0 / 0
Регистрация: 03.02.2021
Сообщений: 2
04.02.2021, 15:15
Всем огромное спасибо!
Разобралась:
все считает верно, просто в матлабе нужно открывать значения переменных для просмотра, а не просто смотреть команд виндоу...
Сама не права.
Код выложенный ранее вполне рабочий....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2021, 15:15
Помогаю со студенческими работами здесь

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

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

Нахождение обратной матрицы
Здравствуйте, уважаемые программисты! Прощу помощи. Для заданной матрицы A(3,3), найти обратную А в -1 степени. Буду очень...

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

Нахождение обратной матрицы
помогите, пожалуйста, для моей матрицы найти обратную ? моя матрица. Можно уменьшить код для нее? void one_matrix(double y0, double...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru