mramine364

matrix inverse

Aug 19th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1.  
  2. #include<iostream>
  3.  
  4. using namespace std;
  5.  
  6. double** matrix(int rl, int cl){
  7.     double** r = new double*[rl];
  8.     for (int i = 0; i < rl; i++)
  9.         r[i] = new double[cl];
  10.     return r;
  11. }
  12.  
  13. void remove(double** m, int rl){
  14.     for (int i = 0; i < rl; i++)
  15.         delete *(m+i);
  16.     delete m;
  17. }
  18.  
  19. void print(double** m, int rl, int cl){
  20.     for (int i = 0; i < rl; i++){
  21.         for (int j = 0; j < cl; j++){
  22.             cout << m[i][j] << ", ";
  23.         }cout << "\n";
  24.     }
  25. }
  26.  
  27. double** subMatrix(double** m, int si, int sj, int rl, int cl){
  28.     double** sm = matrix(rl - 1, cl - 1);
  29.     int ki = 0, kj = 0;
  30.     for (int i = 0; i<rl; i++){
  31.         if (si == i) continue;
  32.         for (int j = 0; j<cl; j++){
  33.             if (sj != j){
  34.                 sm[ki][kj] = m[i][j];
  35.                 if (kj == cl-1 - 1){
  36.                     kj = 0;
  37.                 }
  38.                 else{
  39.                     kj++;
  40.                 }
  41.             }
  42.         }
  43.         ki++;
  44.     }
  45.     return sm;
  46. }
  47.  
  48. double det(double** m, int rl, int cl){
  49.     if (cl == 1 && rl == 1)
  50.         return m[0][0];
  51.     double d = 0;
  52.     int p = 1;
  53.     for (int i = 0; i<rl; i++){
  54.         if (m[0][i] != 0){
  55.             double** sm = subMatrix(m, 0, i, rl, cl);
  56.             d += p*m[0][i] * det(sm, rl-1, cl-1);
  57.             remove(sm, rl-1);
  58.         }          
  59.         p *= -1;
  60.     }
  61.     return d;
  62. }
  63.  
  64. double** inverse(double** m, int rl, int cl){
  65.     double** inv = matrix(rl, cl);
  66.     double d = det(m, rl, cl); int p;
  67.     for (int i = 0; i < rl; i++){
  68.         for (int j = 0; j < cl; j++){
  69.             p = ((i + j) % 2 == 0) ? 1 : -1;
  70.             double** sm = subMatrix(m, j, i, rl, cl);
  71.             inv[i][j] = p*det(sm, rl - 1, cl - 1) / d;
  72.             remove(sm, rl - 1);
  73.         }
  74.     }
  75.     return inv;
  76. }
  77.  
  78. int main(){
  79.    
  80.     double** m = matrix(3,3);
  81.     m[0][0] = 1; m[0][1] = 2; m[0][2] = 3;
  82.     m[1][0] = 11; m[1][1] = 5; m[1][2] = 6;
  83.     m[2][0] = 7; m[2][1] = 8; m[2][2] = 9;
  84.    
  85.     print(m, 3, 3);
  86.     cout << endl;
  87.  
  88.     double** inv = inverse(m, 3, 3);
  89.     print(inv, 3, 3);
  90.  
  91.     remove(m, 3);
  92.     remove(inv, 3);
  93.  
  94.     getchar();
  95.     return 0;
  96. }
Add Comment
Please, Sign In to add comment