Advertisement
Josif_tepe

Untitled

Apr 14th, 2024
851
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5. typedef long long ll;
  6. typedef vector<vector<int>> matrix;
  7. typedef vector<vector<double>> d_matrix;
  8. const int maxn = 1e5 + 10;
  9. const int INF = 2e9;
  10. void print(matrix A) {
  11.     int n = (int) A.size(), m = (int) A[0].size();
  12.     for(int i = 0; i < n; i++) {
  13.         for(int j = 0; j < m; j++) {
  14.             cout << A[i][j] << " ";
  15.         }
  16.         cout << endl;
  17.     }
  18.     cout << endl;
  19. }
  20. void print(d_matrix A) {
  21.     int n = (int) A.size(), m = (int) A[0].size();
  22.     for(int i = 0; i < n; i++) {
  23.         for(int j = 0; j < m; j++) {
  24.             cout << A[i][j] << " ";
  25.         }
  26.         cout << endl;
  27.     }
  28.     cout << endl;
  29. }
  30. matrix multiply_by_k(matrix A, int k) {
  31.     matrix res = A;
  32.     int n = (int) A.size(), m = (int) A[0].size();
  33.    
  34.     for(int i = 0; i < n; i++) {
  35.         for(int j = 0; j < m; j++) {
  36.             res[i][j] *= k;
  37.         }
  38.     }
  39.     return res;
  40. }
  41. matrix add_two_matrices(matrix A, matrix B) {
  42.     int n_a = (int) A.size(), m_a = (int) A[0].size();
  43.     int n_b = (int) B.size(), m_b = (int) B[0].size();
  44.    
  45.     if(n_a == n_b and m_a == m_b) {
  46.         matrix res = A;
  47.         for(int i = 0; i < n_a; i++) {
  48.             for(int j = 0; j < m_a; j++) {
  49.                 res[i][j] = A[i][j] + B[i][j];
  50.             }
  51.         }
  52.         return res;
  53.     }
  54.     cout << "Dimenziite na matricite treba da se isti za da mozhe da gi sobereme istite" << endl;
  55.     return {{0}};
  56. }
  57. matrix subtract_two_matrices(matrix A, matrix B) {
  58.     int n_a = (int) A.size(), m_a = (int) A[0].size();
  59.     int n_b = (int) B.size(), m_b = (int) B[0].size();
  60.    
  61.     if(n_a != n_b or m_a != m_b) {
  62.         cout << "Dimenziite na matricite treba da se isti za da mozhe da gi sobereme istite" << endl;
  63.         return {{0}};
  64.     }
  65.     matrix res = A;
  66.     for(int i = 0; i < n_a; i++) {
  67.         for(int j = 0; j < m_a; j++) {
  68.             res[i][j] = A[i][j] - B[i][j];
  69.         }
  70.     }
  71.     return res;
  72. }
  73. matrix multiply_two_matrices(matrix A, matrix B) {
  74.     int n_a = (int) A.size(), m_a = (int) A[0].size();
  75.     int n_b = (int) B.size(), m_b = (int) B[0].size();
  76.    
  77.     if(m_a != n_b) {
  78.         cout << "Matricite ne mozhat da se mnozhat" << endl;
  79.         return {{0}};
  80.     }
  81.     matrix res(n_a, vector<int>(m_b, 0));
  82.     for(int i = 0; i < n_a; i++) {
  83.         for(int j = 0; j < m_b; j++) {
  84.             int c = 0;
  85.             for(int k = 0; k < n_a; k++) {
  86.                 c += A[i][k] * B[k][j];
  87.             }
  88.             res[i][j] = c;
  89.         }
  90.     }
  91.    
  92.     return res;
  93. }
  94. int determinant_of_matrix(matrix A) {
  95.     int sz = (int) A.size();
  96.     if(sz == 2) {
  97.         return (A[0][0] * A[1][1]) - (A[0][1] * A[1][0]);
  98.     }
  99.     int determinant = 0;
  100.     int sign = 1;
  101.     for(int i = 0; i < sz; i++) {
  102.         int n = 0, m = 0;
  103.        
  104.         matrix tmp(sz - 1, vector<int>(sz - 1, 0));
  105.         for(int j = 0; j < sz; j++) {
  106.             for(int k = 0; k < sz; k++) {
  107.                 if(j != 0 and k != i) {
  108.                     tmp[n][m] = A[j][k];
  109.                     if(m < sz - 2) {
  110.                         m++;
  111.                     }
  112.                     else {
  113.                         m = 0;
  114.                         n++;
  115.                     }
  116.                 }
  117.             }
  118.            
  119.         }
  120.         determinant = determinant + sign*(A[0][i]) * determinant_of_matrix(tmp);
  121.         sign *= -1;
  122.     }
  123.     return determinant;
  124. }
  125. matrix transpose_matrix(matrix A) {
  126.     int n = (int) A.size();
  127.     int m = (int) A[0].size();
  128.     matrix res(m, vector<int>(n));
  129.    
  130.     for(int j = 0; j < m; j++) {
  131.         for(int i = 0; i < n; i++) {
  132.             res[j][i] = A[i][j];
  133.         }
  134.     }
  135.    
  136.     return res;
  137. }
  138. d_matrix inverse_of_matrix(matrix A) {
  139.     int n = (int) A.size();
  140.     int m = (int) A[0].size();
  141.     d_matrix res(n, vector<double>(m));
  142.    
  143.     matrix adj_matrix(n, vector<int>(m));
  144.    
  145.     for(int i = 0; i < n; i++) {
  146.         for(int j = 0; j < m; j++) {
  147.             matrix minor(n - 1, vector<int>(m - 1));
  148.             int r = 0, c = 0;
  149.             for(int a = 0; a < n; a++) {
  150.                 if(a == i) continue;
  151.                 for(int b = 0; b < m; b++) {
  152.                     if(a == i or b == j) continue;
  153.                     minor[r][c] = A[a][b];
  154.                     c++;
  155.                 }
  156.                 c = 0;
  157.                
  158.                 r++;
  159.             }
  160.             adj_matrix[i][j] = determinant_of_matrix(minor);
  161.             if((i + j) % 2 == 1) {
  162.                 adj_matrix[i][j] *= -1;
  163.             }
  164.         }
  165.     }
  166.     adj_matrix = transpose_matrix(adj_matrix);
  167.     double det = determinant_of_matrix(A);
  168.     cout << det << endl;
  169.     for(int i = 0; i < n; i++) {
  170.         for(int j = 0; j < m; j++) {
  171.             res[i][j] = (1.0 / det) * adj_matrix[i][j];
  172.         }
  173.     }
  174.    
  175.     return res;
  176. }
  177.  
  178.  
  179. int main() {
  180.     matrix A = {
  181.         {1, 1, 2},
  182.         {3, 3, 2},
  183.         {1, 0, 1},
  184.        
  185.     };
  186.  
  187.    
  188.     print(inverse_of_matrix(A));
  189.     return 0;
  190. }
  191.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement