Guest User

Untitled

a guest
Apr 14th, 2013
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Nie używaj zmiennych globalnych, ani dyrektyw #define
  2. // Utrudniają one zrobienie ogólnych funkcji.
  3.  
  4. #include <cmath>
  5. #include <cstdio>
  6. #include <cstdlib>
  7.  
  8. double ** matrix(int n);               // alokuje macierz nxn
  9. void free_matrix(double **A, int n);   // zwalnia macierz nxn
  10. void transpose(double **A, int n);     // Transponuje macierz nxn
  11. void print_matrix(double **A, int n);  // Wypisuje macierz nxn na ekran
  12.  
  13. // Liczy wyznacznik macierzy nxn. Nie powinien zmieniac macierzy A.
  14. double det(double **A, int n);
  15.  
  16. // Kopiuje z A do B wszystkie elementy oprócz elementów z wiersza r i kolumny k
  17. void copy_without(double **B, double **A, int r, int k, int n);
  18.  
  19. // Odwraca macierz nxn
  20. void inverse(double **A, int n) {
  21.     static const double eps = 1e-10;
  22.     double detA = det(A, n);
  23.     if (fabs(detA) < eps) {
  24.         printf("Macierz jest osobliwa!\n");
  25.         return;
  26.     }
  27.    
  28.     double **B = matrix(n-1);        // Macierz pomocnicza.
  29.     double **D = matrix(n);          // Macierz dopełnień.
  30.    
  31.     // W każdej iteracji będziemy rozwijać wzór na elemencie A[r][k]
  32.     for (int r = 0; r < n; r++) {
  33.         for (int k = 0; k < n; k++) {
  34.             copy_without(B, A, r, k, n);
  35.             int sign = ((r+k)%2 == 0) ? 1 : -1;
  36.             D[r][k] = sign * det(B, n-1);
  37.         }
  38.     }
  39.     transpose(D, n);
  40.     for (int r = 0; r < n; r++) {
  41.         for (int k = 0; k < n; k++) {
  42.             A[r][k] = D[r][k] / detA;
  43.         }
  44.     }
  45.        
  46.     free_matrix(D, n);
  47.     free_matrix(B, n-1);
  48. }
  49.  
  50. int main(void) {
  51.     printf("dla A:\n");
  52.    
  53.     double **A = matrix(2);
  54.     A[0][0] = 2;    A[0][1] = 1;
  55.     A[1][0] = 5;    A[1][1] = 3;
  56.     print_matrix(A, 2);
  57.     inverse(A, 2);
  58.     print_matrix(A, 2);
  59.     free_matrix(A, 2);
  60.    
  61. /*
  62.    dla A:
  63.          2          1
  64.          5          3
  65.  
  66.          3         -1
  67.         -5          2
  68. */
  69.    
  70.     printf("dla B:\n");
  71.     srand(4);
  72.     double **B = matrix(4);
  73.     for (int i = 0; i < 4; i++) {
  74.         for (int j = 0; j < 4; j++) {
  75.             B[i][j] = (rand() % 10);
  76.         }
  77.     }
  78.     print_matrix(B, 4);
  79.     inverse(B, 4);
  80.     print_matrix(B, 4);
  81.     free_matrix(B, 4);
  82.    
  83. /*
  84.    dla B:
  85.          1          5          9          6
  86.          5          4          5          6
  87.          0          0          1          7
  88.          2          0          2          7
  89.  
  90. -0.0894569   0.111821  -0.284345   0.265176
  91. -0.0734824   0.341853   0.587859  -0.817891
  92.          0          0   -0.43131   0.469649
  93.          0          0   0.204473 -0.0670927
  94. */
  95.    
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment