Загрузка данных


#include <iostream>
#include <locale.h>
using namespace std;

const int N = 16;

void fillMatrix(double a[N][N], int n)
{
    int num = 1;

    for (int d = 0; d < 2 * n - 1; d++)
    {
        if (d % 2 == 0) // чётная диагональ
        {
            int i;
            int j;

            if (d < n)
            {
                i = 0;
                j = n - 1 - d; // старт справа
            }
            else
            {
                i = d - n + 1;
                j = 0;
            }

            while (i < n && j < n)
            {
                a[i][j] = num;
                num = num + 1;

                i = i + 1;
                j = j + 1; // вниз-вправо
            }
        }
        else // нечётная диагональ
        {
            int i;
            int j;

            if (d < n)
            {
                i = d;
                j = n - 1;
            }
            else
            {
                i = n - 1;
                j = 2 * n - 2 - d;
            }

            while (i >= 0 && j >= 0)
            {
                a[i][j] = num;
                num = num + 1;

                i = i - 1;
                j = j - 1; // вверх-влево
            }
        }
    }
}

// Вывод матрицы
void printMatrix(double a[N][N], int n)
{
    for (int i = 0; i < n; i = i + 1)
    {
        for (int j = 0; j < n; j = j + 1)
        {
            cout << a[i][j] << "      ";
        }
        cout << endl;
    }
}

// Нахождение обратной матрицы (метод Гаусса)
bool inverse(double A[N][N], double inv[N][N], int n)
{
    double temp[N][2 * N]; // расширенная матрица

    // создаём [A | E]
    for (int i = 0; i < n; i = i + 1)
    {
        for (int j = 0; j < n; j = j + 1)
        {
            temp[i][j] = A[i][j]; // копируем A

            if (i == j)
            {
                temp[i][j + n] = 1; // единичная матрица
            }
            else
            {
                temp[i][j + n] = 0;
            }
        }
    }

    // метод Гаусса
    for (int i = 0; i < n; i = i + 1)
    {
        double diag = temp[i][i]; // главный элемент

        if (diag == 0)
        {
            return false; // делить нельзя - нет обратной
        }

        // делим строку на главный элемент
        for (int j = 0; j < 2 * n; j = j + 1)
        {
            temp[i][j] = temp[i][j] / diag;
        }

        // зануляем остальные элементы в столбце
        for (int k = 0; k < n; k = k + 1)
        {
            if (k != i)
            {
                double factor = temp[k][i];

                for (int j = 0; j < 2 * n; j = j + 1)
                {
                    temp[k][j] = temp[k][j] - factor * temp[i][j];
                }
            }
        }
    }

    // извлекаем обратную матрицу
    for (int i = 0; i < n; i = i + 1)
    {
        for (int j = 0; j < n; j = j + 1)
        {
            inv[i][j] = temp[i][j + n];
        }
    }

    return true;
}

// Умножение матриц
void multiply(double A[N][N], double B[N][N], double C[N][N], int n)
{
    for (int i = 0; i < n; i = i + 1)
    {
        for (int j = 0; j < n; j = j + 1)
        {
            C[i][j] = 0;

            for (int k = 0; k < n; k = k + 1)
            {
                C[i][j] = C[i][j] + A[i][k] * B[k][j];
            }
        }
    }
}

// Главная функция
int main()
{
    setlocale(LC_ALL, "rus");
    int n;
    cout << "n = ";
    cin >> n;

    double A[N][N];
    double inv[N][N];
    double C[N][N];

    fillMatrix(A, n);

    cout << "Исходная матрица:\n";
    printMatrix(A, n);

    if (inverse(A, inv, n) == false) // пытаемся найти обратную
    {
        cout << "Нет обратной матрицы\n";
        return 0;
    }

    cout << "Обратная матрицца:\n";
    printMatrix(inv, n);

    multiply(A, inv, C, n);

    cout << "Умножение:\n";
    printMatrix(C, n);

    return 0;
}