Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Обратная матрица C++ (http://forum.oszone.net/showthread.php?t=325824)

YURITIGER 11-04-2017 14:27 2728335

Обратная матрица C++
 
Доброго времени суток!
Возникла необходимость найти обратную матрицу любым из способов, так как в программировании только делаю первые шаги, обратился к форуму. Нашел множество работающих решений в темах форума, но не смог до конца разобраться.
Нашел этот простой рабочий код (спасибо автору).

Код:

#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 2728374

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

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

Код:

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


nikita_lu 29-10-2020 02:51 2937988

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

SappyPunk 12-02-2021 20:29 2949865

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


Время: 16:01.

Время: 16:01.
© OSzone.net 2001-