View difference between Paste ID: Y8nC1Wtq and eXti5Hhw
SHOW: | | - or go back to the newest paste.
1
// Nie używaj zmiennych globalnych, ani dyrektyw #define
2
// Utrudniają one zrobienie ogólnych funkcji.
3
4
double ** matrix(int n);             // alokuje macierz nxn
5
void free_matrix(double **A, int n); // zwalnia macierz nxn
6
double det(double **A, int n);       // Liczy wyznacznik macierzy nxn
7
void transpose(double **A, int n);   // Transponuje macierz nxn
8
9
// Kopiuje z A do B wszystkie elementy oprócz elementów z wiersza r i kolumny k
10
void copyWithout(double **B, const double **A, int r, int k, int n);
11
12
// Odwraca macierz nxn
13
void inverse(double **A, int n) {
14
	double **B = matrix(n-1);        // Macierz pomocnicza.
15
	double **D = matrix(n);          // Macierz dopełnień.
16
	
17
	// W każdej iteracji będziemy rozwijać wzór na elemencie A[r][k]
18
	for (int r = 0; r < n; r++) {
19
		for (int k = 0; k < n; k++) {
20
			copyWithout(B, A, r, k, n);
21
			int sign = ((r+k)%2 == 0) ? 1 : -1;
22
			D[r][k] = sign * det(B, n-1);
23
		}
24
	}
25
	transpose(D, n);
26
	for (int r = 0; r < n; r++) {
27
		for (int k = 0; k < n; k++) {
28
			A[r][k] = D[r][k];
29
		}
30
	}
31
		
32-
	free_matrix(D);
32+
	free_matrix(D, n);
33-
	free_matrix(B);
33+
	free_matrix(B, n-1);
34
}