Advertisement
Ansaid

Обратная матрица черновик

May 22nd, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.16 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.         cout << endl;
  46.     }
  47.  
  48.  
  49.     vector <vector <double>> arr_copy(SIZE, vector <double>(SIZE)); // создает двумерный вектор размера SIZE для хранения дубликата транспонированной матрицы
  50.     for (int i = 0; i < SIZE; i++) // присванивание значений из транспонированной матрицы
  51.     {
  52.         for (int j = 0; j < SIZE; j++)
  53.         {
  54.             arr_copy[i][j] = arr[i][j];
  55.         }
  56.     }
  57.  
  58.     for (int i = 0; i < SIZE; i++) // вывод транспонированной матрицы
  59.     {
  60.         for (int j = 0; j < SIZE; j++)
  61.         {
  62.             cout << arr[i][j] << "\t";
  63.         }
  64.         cout << endl;
  65.     }
  66.     cout << endl;
  67.  
  68.     for (int i = 0; i < SIZE; i++) // вычисление союзной матрицы
  69.     {
  70.         for (int j = 0; j < SIZE; j++)
  71.         {
  72.             arr[i][j] = minor(arr_copy, SIZE, i, j);
  73.         }
  74.         cout << endl;
  75.     }
  76.  
  77.     for (int i = 0; i < SIZE; i++) // вывод союзной матрицы
  78.     {
  79.         for (int j = 0; j < SIZE; j++)
  80.         {
  81.             cout << arr[i][j] << "\t";
  82.         }
  83.         cout << endl;
  84.     }
  85.  
  86.     /*ПОДСЧЕТ ОПРЕДЕЛИТЕЛЯ*/
  87.     double temp = 0;      // временная переменная для хранения элемента
  88.     int temp_index = 0;   // временная переменная для хранения индекса элемента
  89.     int temp_size = SIZE; //кол-во повторов
  90.     double opredelitel = 1;   // переменная для хранения накопленного произведения коэффициентов при минорах
  91.  
  92.     if (SIZE == 1)
  93.     {
  94.         opredelitel = opredelitel * arr_copy[0][0];
  95.         cout << "Определитель = " << opredelitel << endl;
  96.         return 0;
  97.     }
  98.  
  99.     for (int t = 0; t < SIZE - 1; t++)
  100.     {
  101.         temp = 0;
  102.         temp_index = 0;
  103.  
  104.         for (int i = 0; i < temp_size; i++) // выбор элемента через который будем делать 0
  105.         {
  106.             if (arr_copy[i][0] != 0)
  107.             {
  108.                 temp = arr_copy[i][0];
  109.                 temp_index = i;
  110.                 break;
  111.             }
  112.         }
  113.  
  114.         if (temp == 0)
  115.         {
  116.             cout << "Определитель матрицы равен 0, Ошибка!!!" << endl;
  117.             return 0;
  118.         }
  119.  
  120.         double k = 0; // коэффициент пропорциональности
  121.  
  122.         for (int i = 0; i < temp_size; i++) // умножение строчки на коэффициент пропорциональности и вычитание ее из всех остальных
  123.         {
  124.             if (i != temp_index)
  125.             {
  126.                 k = arr_copy[i][0] / temp;
  127.                 for (int j = 0; j < temp_size; j++)
  128.                 {
  129.                     arr_copy[i][j] = arr_copy[i][j] - arr_copy[temp_index][j] * k;
  130.                 }
  131.             }
  132.         }
  133.  
  134.         if (temp_index % 2 == 0)
  135.             opredelitel = opredelitel * temp;
  136.         else
  137.             opredelitel = -opredelitel * temp;
  138.  
  139.         temp_size--; // уменьшаем размер матрицы
  140.  
  141.         arr_copy.erase(arr_copy.begin()); // делаем вектор на 1 меньше(удаляем 1 столбец)
  142.         for (int i = 0; i < temp_size; i++) // удаляем строчку
  143.         {
  144.             arr_copy[i].erase(arr_copy[i].begin() + temp_index);
  145.         }
  146.  
  147.         if (temp_size == 1)
  148.             opredelitel = opredelitel * arr_copy[0][0];
  149.     }
  150.     /*ОПРЕДЕЛИТЕЛЬ ПОСЧИТАН*/
  151.  
  152.  
  153.     for (int i = 0; i < SIZE; i++) // умножение (1/определитель) на союзную матрицу
  154.     {
  155.         for (int j = 0; j < SIZE; j++)
  156.         {
  157.             arr[i][j] = arr[i][j] * (1 / opredelitel);
  158.         }
  159.     }
  160.  
  161.     cout << endl;
  162.     for (int i = 0; i < SIZE; i++) // вывод обратной матрицы
  163.     {
  164.         for (int j = 0; j < SIZE; j++)
  165.         {
  166.             cout << arr[i][j] << "\t";
  167.         }
  168.         cout << endl;
  169.     }
  170.  
  171.     /*cout << endl;
  172.     arr[2][2] = minor(arr, SIZE, 2, 1);*/
  173. }
  174.  
  175. double minor(vector <vector <double>> arr, int SIZE, int stroka, int stolbik)
  176. {
  177.     /*for (int i = 0; i < SIZE; i++) // вывод матрицы
  178.     {
  179.         for (int j = 0; j < SIZE; j++)
  180.         {
  181.             cout << arr[i][j] << "\t";
  182.         }
  183.         cout << endl;
  184.     }*/
  185.  
  186.     SIZE--; // уменьшаем размер матрицы
  187.  
  188.     arr.erase(arr.begin() + stroka); // делаем вектор на 1 меньше(удаляем 1 столбец)
  189.     for (int i = 0; i < SIZE; i++) // удаляем строчку
  190.     {
  191.         arr[i].erase(arr[i].begin() + stolbik);
  192.     }
  193.  
  194.  
  195.     double chethik;   // переменная для хранения накопленного произведения коэффициентов при минорах
  196.  
  197.     if ((stroka + stolbik) % 2 == 0)
  198.         chethik = 1;
  199.     else
  200.         chethik = -1;
  201.  
  202.     if (SIZE == 1)
  203.     {
  204.         chethik = chethik * arr[0][0];
  205.         cout << "Минор = " << chethik << endl;
  206.         return chethik;
  207.     }
  208.  
  209.     double temp = 0;      // временная переменная для хранения элемента
  210.     int temp_index = 0;   // временная переменная для хранения индекса элемента
  211.     int repeat = SIZE - 1; //кол-во повторов
  212.  
  213.     for (int t = 0; t < repeat; t++)
  214.     {
  215.         temp = 0;
  216.         temp_index = 0;
  217.  
  218.         for (int i = 0; i < SIZE; i++) // выбор элемента через который будем делать 0
  219.         {
  220.             if (arr[i][0] != 0)
  221.             {
  222.                 temp = arr[i][0];
  223.                 temp_index = i;
  224.                 break;
  225.             }
  226.         }
  227.  
  228.         if (temp == 0) //определитель равен 0
  229.         {
  230.             return 0;
  231.         }
  232.  
  233.         double k = 0; // коэффициент пропорциональности
  234.  
  235.         for (int i = 0; i < SIZE; i++) // умножение строчки на коэффициент пропорциональности и вычитание ее из всех остальных
  236.         {
  237.             if (i != temp_index)
  238.             {
  239.                 k = arr[i][0] / temp;
  240.                 for (int j = 0; j < SIZE; j++)
  241.                 {
  242.                     arr[i][j] = arr[i][j] - arr[temp_index][j] * k;
  243.                 }
  244.             }
  245.         }
  246.  
  247.         if (temp_index % 2 == 0)
  248.             chethik = chethik * temp;
  249.         else
  250.             chethik = -chethik * temp;
  251.  
  252.         SIZE--; // уменьшаем размер матрицы
  253.  
  254.         arr.erase(arr.begin()); // делаем вектор на 1 меньше(удаляем 1 столбец)
  255.         for (int i = 0; i < SIZE; i++) // удаляем строчку
  256.         {
  257.             arr[i].erase(arr[i].begin() + temp_index);
  258.         }
  259.  
  260.         if (SIZE == 1)
  261.             chethik = chethik * arr[0][0];
  262.     }
  263.  
  264.     cout << "Минор = " << chethik << endl;
  265.     return chethik;
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement