Advertisement
habur331

Untitled

Mar 27th, 2022
903
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.28 KB | None | 0 0
  1. #include <bitset>
  2. #include <fstream>
  3. #include <iomanip>
  4. #include <iostream>
  5. #include <map>
  6. #include <cmath>
  7.  
  8. using namespace std;
  9.  
  10. map <pair<int, int>, long double> calculatedMinorsDets;
  11.  
  12. long double** createMatrix(int rowNumber, int columnNumber)
  13. {
  14.     auto** matrix = new long double* [rowNumber];
  15.  
  16.     for (int i = 0; i < rowNumber; i++)
  17.         matrix[i] = new long double[columnNumber];
  18.  
  19.     for (int i = 0; i < rowNumber; i++)
  20.     {
  21.         for (int j = 0; j < columnNumber; j++)
  22.             matrix[i][j] = 0;
  23.     }
  24.  
  25.     return matrix;
  26. }
  27.  
  28. void deleteMatrix(long double** matrix, int sizeMatrix)
  29. {
  30.     for (int i = 0; i < sizeMatrix; i++)
  31.         delete[] matrix[i];
  32.  
  33.     delete matrix;
  34. }
  35.  
  36. long double calculateDeterminant(long double** matrix, int matrixSize, int currentMatrixSize, pair<int, int> minorMask)
  37. {
  38.     //if det has calculated return it
  39.     if (calculatedMinorsDets.find(minorMask) != calculatedMinorsDets.end())
  40.         return calculatedMinorsDets[minorMask];
  41.  
  42.     long double ans = 0;
  43.  
  44.     //base case 1by1 matrix
  45.     if (currentMatrixSize == 1)
  46.         return matrix[0][0];
  47.  
  48.     //base case 2by2 matrix
  49.     if (currentMatrixSize == 2)
  50.     {
  51.         int ci1 = -1, ci2 = -1, ri1 = -1, ri2 = -1;
  52.         for (int i = 0; i < matrixSize; i++)
  53.         {
  54.             if (minorMask.first & (1 << (matrixSize - 1 - i)))
  55.             {
  56.                 ri1 = (ri1 == -1 ? i : ri1);
  57.                 ri2 = (ri2 == -1 && ri1 != -1 ? i : ri2);
  58.             }
  59.             if (minorMask.second & (1 << (matrixSize - 1 - i)))
  60.             {
  61.                 ci1 = (ci1 == -1 ? i : ci1);
  62.                 ci2 = (ci2 == -1 && ci1 != -1 ? i : ci2);
  63.             }
  64.         }
  65.  
  66.         calculatedMinorsDets[minorMask] = matrix[ri1][ci1] * matrix[ri2][ci2] - matrix[ri1][ci2] * matrix[ri2][ci1];
  67.         return calculatedMinorsDets[minorMask];
  68.     }
  69.  
  70.     //recursive calls
  71.  
  72.     int ri = 0, sign = 1;
  73.     while (!(minorMask.first & (1 << (matrixSize - 1 - ri))))
  74.         ri++;
  75.  
  76.     for (int ci = 0; ci < matrixSize; ci++)
  77.     {
  78.         if (minorMask.second & (1 << (matrixSize - 1 - ci)))
  79.         {
  80.             ans += sign * matrix[ri][ci] * calculateDeterminant(matrix, matrixSize, currentMatrixSize - 1, { minorMask.first ^ (1 << (matrixSize - 1 - ri)), minorMask.first ^ (1 << (matrixSize - 1 - ri)) });
  81.             sign = -sign;
  82.         }
  83.     }
  84.  
  85.     calculatedMinorsDets[minorMask] = ans;
  86.  
  87.     return ans;
  88. }
  89.  
  90.  
  91. void calculateInverseMatrix(long double** matrix, int matrixSize, long double** inverseMatrix)
  92. {
  93.     pair<int, int> minorMask = { (1 << (matrixSize)) - 1,(1 << (matrixSize)) - 1 };
  94.     long double determinant = calculateDeterminant(matrix, matrixSize, matrixSize, minorMask);
  95.  
  96.     for (int i = 0; i < matrixSize; i++)
  97.     {
  98.         for (int j = 0; j < matrixSize; j++)
  99.         {
  100.             inverseMatrix[j][i] = calculateDeterminant(matrix, matrixSize, matrixSize - 1, { minorMask.first ^ (1 << (matrixSize - 1 - i)), minorMask.first ^ (1 << (matrixSize - 1 - j)) }) / determinant;
  101.         }
  102.     }
  103. }
  104.  
  105. long double** multiplyMatrices(long double** a, int a_rowNumber, int a_columnNumber, long double** b, int b_rowNumber, int b_columnNumber)
  106. {
  107.     if (a_columnNumber != b_rowNumber)
  108.         exit(-1);
  109.  
  110.     auto multiplicationMatrix = createMatrix(a_rowNumber, b_columnNumber);
  111.  
  112.     for (int r_a = 0; r_a < a_rowNumber; r_a++)
  113.     {
  114.         for (int c_b = 0; c_b < b_columnNumber; c_b++)
  115.         {
  116.             long double result = 0.0;
  117.  
  118.             for (int c_a = 0, r_b = 0; c_a < a_columnNumber && r_b < b_rowNumber; c_a++, r_b++)
  119.             {
  120.                 result += a[r_a][c_a] * b[r_b][c_b];
  121.             }
  122.  
  123.             multiplicationMatrix[r_a][c_b] = result;
  124.         }
  125.     }
  126.  
  127.     return multiplicationMatrix;
  128. }
  129.  
  130. long double** transposeMatrix(long double** a, int a_rowNumber, int a_columnNumber)
  131. {
  132.     long double** result = createMatrix(a_columnNumber, a_rowNumber);
  133.  
  134.     for (int i = 0; i < a_rowNumber; i++)
  135.     {
  136.         for (int j = 0; j < a_columnNumber; j++)
  137.         {
  138.             result[j][i] = a[i][j];
  139.         }
  140.     }
  141.  
  142.     /*for (int i = 0; i < a_columnNumber; i++)
  143.     {
  144.         for (int j = 0; j < a_rowNumber; j++)
  145.         {
  146.             cout << result[i][j] << " ";
  147.         }
  148.         cout << endl;
  149.     }*/
  150.  
  151.  
  152.     return result;
  153. }
  154.  
  155. int main()
  156. {
  157.     //cout << calculatedMinors[{0,0}] << endl;
  158.  
  159.  
  160.     ifstream in("input.txt");
  161.     ofstream out("output.txt");
  162.     out << fixed << setprecision(2);
  163.  
  164.     int n, m;
  165.     in >> n >> m;
  166.     n++;
  167.  
  168.     auto A = createMatrix(m, n);
  169.     auto b = createMatrix(m, 1);
  170.  
  171.     for (int i = 0; i < m; i++)
  172.     {
  173.         for (int j = 0; j <= n; j++)
  174.         {
  175.             if (j == 0)
  176.                 A[i][0] = 1.0;
  177.             else
  178.             {
  179.                 if (j != n)
  180.                     in >> A[i][j];
  181.                 else in >> b[i][0];
  182.             }
  183.         }
  184.     }
  185.  
  186.     out << "A:\n";
  187.     for (int i = 0; i < m; i++)
  188.     {
  189.         for (int j = 0; j < n; j++)
  190.             out << A[i][j] << " ";
  191.         out << "\n";
  192.     }
  193.  
  194.     out << "\nb:\n";
  195.     for (int i = 0; i < m; i++)
  196.         out << b[i][0] << "\n";
  197.  
  198.     long double** A_T = transposeMatrix(A, m, n);
  199.  
  200.     long double** A_T_A = multiplyMatrices(A_T, n, m, A, m, n);
  201.     out << "\nA_T*A:\n";
  202.     for (int i = 0; i < n; i++)
  203.     {
  204.         for (int j = 0; j < n; j++)
  205.             out << A_T_A[i][j] << " ";
  206.         out << "\n";
  207.     }
  208.  
  209.     long double** inverse = createMatrix(n, n);
  210.     calculateInverseMatrix(A_T_A, n, inverse);
  211.  
  212.     out << "\n(A_T*A)_-1:\n";
  213.     for (int i = 0; i < n; i++)
  214.     {
  215.         for (int j = 0; j < n; j++)
  216.             out << inverse[i][j] << " ";
  217.         out << "\n";
  218.     }
  219.  
  220.     long double** proj = multiplyMatrices(inverse, n, n, A_T, n, m);
  221.     out << "\n(A_T*A)_-1*A_T:\n";
  222.     for (int i = 0; i < n; i++)
  223.     {
  224.         for (int j = 0; j < m; j++)
  225.             out << proj[i][j] << " ";
  226.         out << "\n";
  227.     }
  228.  
  229.     long double** x = multiplyMatrices(proj, n, m, b, m, 1);
  230.     out << "\nx:\n";
  231.     for (int i = 0; i < n; i++)
  232.         out << x[i][0] << "\n";
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement