Войти

Показать полную графическую версию : Обратная матрица C++


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}};


Если у кого-то есть пару минут, объясните пожалуйста.

shisik
11-04-2017, 17:20
Ну вот в функции main с самого начала и до вызова inversion - это что? Это и есть создание и заполнение матрицы. Вот вместо него и вставляйте код с заранее определённой матрицей.

Да, если матрица создаётся не динамически, то освобождение памяти тоже не нужно:


for (int i = 0; i < N; i++)
delete [] matrix[i];

delete [] matrix;

nikita_lu
29-10-2020, 02:51
YURITIGER, От души, спасибо, всех благ) Часа 2 искал код для рассчета обратной матрицы :teeth:

SappyPunk
12-02-2021, 20:29
А как мне совместить данный код с другим?
Дело в том что мне нужно сделать что-то на подобии матричного калькулятора, где так же нужно реализовать нахождение обратной матрицы, только её я и не могу сделать XD
Не могу понять в какую часть кода мне вставить это, так как вижуал ругаеться постоянно на что-то.
Хотя без моей программы всё работает хорошо




© OSzone.net 2001-2012