Advertisement
Ansaid

Обратная матрица

May 22nd, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.42 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <time.h>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. double minor(vector <vector <double>> arr, int SIZE, int stroka, int stolbik);
  10.  
  11. int main()
  12. {
  13.     setlocale(LC_ALL, "Russian");
  14.     srand(time(NULL));
  15.     int SIZE;
  16.     cout << "Введите размерность матрицы: "; // ввод размерности
  17.     cin >> SIZE;
  18.  
  19.     vector <vector <double>> arr(SIZE, vector <double>(SIZE)); // создает двумерный вектор размера SIZE
  20.  
  21.  
  22.     for (int i = 0; i < SIZE; i++) // присванивание значений матрице
  23.     {
  24.         for (int j = 0; j < SIZE; j++)
  25.         {
  26.             arr[i][j] = rand() % 10;
  27.         }
  28.     }
  29.  
  30.     for (int i = 0; i < SIZE; i++) // вывод матрицы
  31.     {
  32.         for (int j = 0; j < SIZE; j++)
  33.         {
  34.             cout << arr[i][j] << "\t";
  35.         }
  36.         cout << endl;
  37.     }
  38.  
  39.     for (int i = 0; i < SIZE - 1; i++) // транспонирование
  40.     {
  41.         for (int j = i + 1; j < SIZE; j++)
  42.         {
  43.             swap(arr[i][j], arr[j][i]);
  44.         }
  45.     }
  46.  
  47.  
  48.     vector <vector <double>> arr_copy(SIZE, vector <double>(SIZE)); // создает двумерный вектор размера SIZE для хранения дубликата транспонированной матрицы
  49.     for (int i = 0; i < SIZE; i++) // присванивание значений из транспонированной матрицы
  50.     {
  51.         for (int j = 0; j < SIZE; j++)
  52.         {
  53.             arr_copy[i][j] = arr[i][j];
  54.         }
  55.     }
  56.  
  57.     for (int i = 0; i < SIZE; i++) // вычисление союзной матрицы
  58.     {
  59.         for (int j = 0; j < SIZE; j++)
  60.         {
  61.             arr[i][j] = minor(arr_copy, SIZE, i, j);
  62.         }
  63.     }
  64.  
  65.     /*ПОДСЧЕТ ОПРЕДЕЛИТЕЛЯ*/
  66.     double temp = 0;      // временная переменная для хранения элемента
  67.     int temp_index = 0;   // временная переменная для хранения индекса элемента
  68.     int temp_size = SIZE; //кол-во повторов
  69.     double opredelitel = 1;   // переменная для хранения накопленного произведения коэффициентов при минорах
  70.  
  71.     if (SIZE == 1)
  72.     {
  73.         opredelitel = opredelitel * arr_copy[0][0];
  74.         cout << "Определитель = " << opredelitel << endl;
  75.         return 0;
  76.     }
  77.  
  78.     for (int t = 0; t < SIZE - 1; t++)
  79.     {
  80.         temp = 0;
  81.         temp_index = 0;
  82.  
  83.         for (int i = 0; i < temp_size; i++) // выбор элемента через который будем делать 0
  84.         {
  85.             if (arr_copy[i][0] != 0)
  86.             {
  87.                 temp = arr_copy[i][0];
  88.                 temp_index = i;
  89.                 break;
  90.             }
  91.         }
  92.  
  93.         if (temp == 0)
  94.         {
  95.             cout << "Определитель матрицы равен 0, Ошибка!!!" << endl;
  96.             return 0;
  97.         }
  98.  
  99.         double k = 0; // коэффициент пропорциональности
  100.  
  101.         for (int i = 0; i < temp_size; i++) // умножение строчки на коэффициент пропорциональности и вычитание ее из всех остальных
  102.         {
  103.             if (i != temp_index)
  104.             {
  105.                 k = arr_copy[i][0] / temp;
  106.                 for (int j = 0; j < temp_size; j++)
  107.                 {
  108.                     arr_copy[i][j] = arr_copy[i][j] - arr_copy[temp_index][j] * k;
  109.                 }
  110.             }
  111.         }
  112.  
  113.         if (temp_index % 2 == 0)
  114.             opredelitel = opredelitel * temp;
  115.         else
  116.             opredelitel = -opredelitel * temp;
  117.  
  118.         temp_size--; // уменьшаем размер матрицы
  119.  
  120.         arr_copy.erase(arr_copy.begin()); // делаем вектор на 1 меньше(удаляем 1 столбец)
  121.         for (int i = 0; i < temp_size; i++) // удаляем строчку
  122.         {
  123.             arr_copy[i].erase(arr_copy[i].begin() + temp_index);
  124.         }
  125.  
  126.         if (temp_size == 1)
  127.             opredelitel = opredelitel * arr_copy[0][0];
  128.     }
  129.     /*ОПРЕДЕЛИТЕЛЬ ПОСЧИТАН*/
  130.  
  131.  
  132.     for (int i = 0; i < SIZE; i++) // умножение (1/определитель) на союзную матрицу
  133.     {
  134.         for (int j = 0; j < SIZE; j++)
  135.         {
  136.             arr[i][j] = arr[i][j] * (1 / opredelitel);
  137.         }
  138.     }
  139.  
  140.  
  141.     cout << endl;
  142.     for (int i = 0; i < SIZE; i++) // вывод обратной матрицы
  143.     {
  144.         for (int j = 0; j < SIZE; j++)
  145.         {
  146.             cout << arr[i][j] << "\t";
  147.         }
  148.         cout << endl;
  149.     }
  150. }
  151.  
  152. double minor(vector <vector <double>> arr, int SIZE, int stroka, int stolbik)
  153. {
  154.     SIZE--; // уменьшаем размер матрицы
  155.  
  156.     arr.erase(arr.begin() + stroka); // делаем вектор на 1 меньше(удаляем 1 столбец)
  157.     for (int i = 0; i < SIZE; i++) // удаляем строчку
  158.     {
  159.         arr[i].erase(arr[i].begin() + stolbik);
  160.     }
  161.  
  162.     double chethik;   // переменная для хранения накопленного произведения коэффициентов при минорах
  163.  
  164.     if ((stroka + stolbik) % 2 == 0)
  165.         chethik = 1;
  166.     else
  167.         chethik = -1;
  168.  
  169.     if (SIZE == 1)
  170.     {
  171.         chethik = chethik * arr[0][0];
  172.         return chethik;
  173.     }
  174.  
  175.     double temp = 0;      // временная переменная для хранения элемента
  176.     int temp_index = 0;   // временная переменная для хранения индекса элемента
  177.     int repeat = SIZE - 1; //кол-во повторов
  178.  
  179.     for (int t = 0; t < repeat; t++)
  180.     {
  181.         temp = 0;
  182.         temp_index = 0;
  183.  
  184.         for (int i = 0; i < SIZE; i++) // выбор элемента через который будем делать 0
  185.         {
  186.             if (arr[i][0] != 0)
  187.             {
  188.                 temp = arr[i][0];
  189.                 temp_index = i;
  190.                 break;
  191.             }
  192.         }
  193.  
  194.         if (temp == 0) //определитель равен 0
  195.         {
  196.             return 0;
  197.         }
  198.  
  199.         double k = 0; // коэффициент пропорциональности
  200.  
  201.         for (int i = 0; i < SIZE; i++) // умножение строчки на коэффициент пропорциональности и вычитание ее из всех остальных
  202.         {
  203.             if (i != temp_index)
  204.             {
  205.                 k = arr[i][0] / temp;
  206.                 for (int j = 0; j < SIZE; j++)
  207.                 {
  208.                     arr[i][j] = arr[i][j] - arr[temp_index][j] * k;
  209.                 }
  210.             }
  211.         }
  212.  
  213.         if (temp_index % 2 == 0)
  214.             chethik = chethik * temp;
  215.         else
  216.             chethik = -chethik * temp;
  217.  
  218.         SIZE--; // уменьшаем размер матрицы
  219.  
  220.         arr.erase(arr.begin()); // делаем вектор на 1 меньше(удаляем 1 столбец)
  221.         for (int i = 0; i < SIZE; i++) // удаляем строчку
  222.         {
  223.             arr[i].erase(arr[i].begin() + temp_index);
  224.         }
  225.  
  226.         if (SIZE == 1)
  227.             chethik = chethik * arr[0][0];
  228.     }
  229.     return chethik;
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement