YURITIGER
11-04-2017, 14:27
Доброго времени суток!
Возникла необходимость найти обратную матрицу любым из способов, так как в программировании только делаю первые шаги, обратился к форуму. Нашел множество работающих решений в темах форума, но не смог до конца разобраться.
Нашел этот простой рабочий код (спасибо автору).
#include <iostream>
void inversion(double **A, int N)
{
double temp;
double **E = new double *[N];
for (int i = 0; i < N; i++)
E[i] = new double [N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
E[i][j] = 0.0;
if (i == j)
E[i][j] = 1.0;
}
for (int k = 0; k < N; k++)
{
temp = A[k][k];
for (int j = 0; j < N; j++)
{
A[k][j] /= temp;
E[k][j] /= temp;
}
for (int i = k + 1; i < N; i++)
{
temp = A[i][k];
for (int j = 0; j < N; j++)
{
A[i][j] -= A[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 = A[i][k];
for (int j = 0; j < N; j++)
{
A[i][j] -= A[k][j] * temp;
E[i][j] -= E[k][j] * temp;
}
}
}
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
A[i][j] = E[i][j];
for (int i = 0; i < N; i++)
delete [] E[i];
delete [] E;
}
int main()
{
int N;
std::cout << "Enter N: ";
std::cin >> N;
double **matrix = new double *[N];
for (int i = 0; i < N; i++)
matrix[i] = new double [N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
std::cout << "Enter matrix[" << i << "][" << j << "] = ";
std::cin >> matrix[i][j];
}
inversion(matrix, N);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
std::cout << matrix[i][j] << " ";
std::cout << std::endl;
}
for (int i = 0; i < N; i++)
delete [] matrix[i];
delete [] matrix;
std::cin.get();
return 0;
}
Но не могу до конца понять что изменить, чтобы исходную матрицу задавать не с клавиатуры, а она была задана изначально:
double matrix [N][N] = {{x1, x2,x3},
{x7, x8, x9}
{x4, x5, x6}};
Если у кого-то есть пару минут, объясните пожалуйста.
Возникла необходимость найти обратную матрицу любым из способов, так как в программировании только делаю первые шаги, обратился к форуму. Нашел множество работающих решений в темах форума, но не смог до конца разобраться.
Нашел этот простой рабочий код (спасибо автору).
#include <iostream>
void inversion(double **A, int N)
{
double temp;
double **E = new double *[N];
for (int i = 0; i < N; i++)
E[i] = new double [N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
E[i][j] = 0.0;
if (i == j)
E[i][j] = 1.0;
}
for (int k = 0; k < N; k++)
{
temp = A[k][k];
for (int j = 0; j < N; j++)
{
A[k][j] /= temp;
E[k][j] /= temp;
}
for (int i = k + 1; i < N; i++)
{
temp = A[i][k];
for (int j = 0; j < N; j++)
{
A[i][j] -= A[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 = A[i][k];
for (int j = 0; j < N; j++)
{
A[i][j] -= A[k][j] * temp;
E[i][j] -= E[k][j] * temp;
}
}
}
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
A[i][j] = E[i][j];
for (int i = 0; i < N; i++)
delete [] E[i];
delete [] E;
}
int main()
{
int N;
std::cout << "Enter N: ";
std::cin >> N;
double **matrix = new double *[N];
for (int i = 0; i < N; i++)
matrix[i] = new double [N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
std::cout << "Enter matrix[" << i << "][" << j << "] = ";
std::cin >> matrix[i][j];
}
inversion(matrix, N);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
std::cout << matrix[i][j] << " ";
std::cout << std::endl;
}
for (int i = 0; i < N; i++)
delete [] matrix[i];
delete [] matrix;
std::cin.get();
return 0;
}
Но не могу до конца понять что изменить, чтобы исходную матрицу задавать не с клавиатуры, а она была задана изначально:
double matrix [N][N] = {{x1, x2,x3},
{x7, x8, x9}
{x4, x5, x6}};
Если у кого-то есть пару минут, объясните пожалуйста.