Проблема с заполнением матрицы c++
Возникла проблема, что нужно было из исходной матрицы любого порядка сделать обратную. Для этого нужно было найти определитель матрицы. Определитель матрицы я подсмотрел, как найти, но не смог заполнить новую матрицу алгебраическими дополнениями. Не понимаю, почему, но считалась только первая строка. Я недавно пишу на c++, поэтому прошу помощи. Ниже код.
#include <iostream>
#include <locale>
// Функция для нахождения алгебраического дополнения
// n - порядок матрицы, k - элемент исходной матрицы, r = (-1) ^ (i + j)
int addition_find(double** matrix, int n, int k, int r)
{
for (int k = 0; k < n - 1; k++)
{
for (int i = k + 1; i < n; i++)
{
int tmp = -matrix[i][k] / matrix[k][k];
for (int j = 0; j < n; j++)
{
matrix[i][j] += matrix[k][j] * tmp;
}
}
}
int det;
det = 1;
for (int i = 0; i < n; i++)
{
det *= matrix[i][i];
}
return r * k * det;
}
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
double tmp;
int n;
cout << "Введите размерность матрицы (n): ";
cin >> n;
double** matrix = new double* [n];
double** matrix_copy = new double* [n];
for (int i = 0; i < n; i++)
{
matrix[i] = new double[n];
}
// Создание копии матрицы
for (int i = 0; i < n; i++)
{
matrix_copy[i] = new double[n];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
matrix[i][j] = 1 + rand() % 100;
}
}
// Наполнение копии матрицы
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
matrix_copy[i][j] = matrix[i][j];
}
}
cout << "Изначальная матрица: " << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << matrix[i][j] << " ";
}
cout << endl;
}
// Приведение матрицы к треугольному виду
for (int k = 0; k < n - 1; k++)
{
for (int i = k + 1; i < n; i++)
{
tmp = -matrix[i][k] / matrix[k][k];
for (int j = 0; j < n; j++)
{
matrix[i][j] += matrix[k][j] * tmp;
}
}
}
cout << "Определитель матрицы: " << endl;
int det;
det = 1;
for (int i = 0; i < n; i++)
{
det *= matrix[i][i];
}
cout.precision(2);
cout << det << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << matrix[i][j] << " ";
}
cout << endl;
}
// Исключаем строки и столбцы
double** last_matrix = new double* [n];
for (int x = 0; x < n; x++)
{
last_matrix[x] = new double[n];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
double** addition = new double* [n - 1]; // Матрица на порядок ниже, чтобы найти минор
for (int x = 0; x < (n - 1); x++)
{
addition[x] = new double[n - 1];
}
for (int x = 0; x < n; x++)
{
for (int y = 0; y < n; y++)
{
if (x != i and y != j)
{
addition[x - 1][y - 1] = matrix_copy[x][y];
}
}
}
last_matrix[i][j] = addition_find(addition, n - 1, matrix_copy[i][j], pow(-1, i + j));
cout << last_matrix[i][j] << " "; // Если выводим алгебраическое дополнение Aij, то их будет всего 4
}
}
return 0;
}
Вывод:
Введите размерность матрицы (n): 5
Изначальная матрица:
42 68 35 1 70
25 79 59 63 65
6 46 82 28 62
92 96 43 28 37
92 5 3 54 93
Определитель матрицы:
1996456730
// Здесь представлена матрица после преобразований, которые позволяют найти определитель
42 68 35 1 70
0 39 38 62 23
0 0 41 -31 30
-1.4e-14 -7.1e-15 0 1.3e+02 -98
2.4e-14 1.9e-14 0 0 2.4e+02
// Здесь представлены только 5 алгебраических дополнений, а не все 25
-6.2e+08 0 -2.1e+09 0 0