Už je to dlouho, co jsem objevil kouzlo rekurzivních algoritmů pro takové úkoly, jako je výpočet faktoriálu, nebo řešení úlohy hanojských věží... Tehdy jsem si řekl, že by bylo pěkné pomocí takového algoritmu počítat determinant matice, metodou rozkladu podle n-tého řádku. Včera jsem si splnil sen:
#define MAX_R 10Program je napsán v C99 a díky staticky definovaným polím je extrémně paměťově náročný a minimálně škálovatelný.:) Podstata řešení spočívá v postupném zjednodušování problému až na úkol spočítat determinant matice 1x1, kterýžto je roven hodnotě jediného prvku matice. Všechny větší matice jsou podle prvního řádku rozloženy na menší a menší.
#include <stdio.h>
double determinant(double matice[MAX_R][MAX_R], int rozmer) {
double det=0;
double submatice[MAX_R][MAX_R];
if (rozmer<1) return 0;
if (rozmer==1) return matice[0][0];
// rozklad podle prvniho radku
for (int i=0; i<rozmer; i++) {
//vypocet submatice
for (int u=0; u<rozmer-1; u++)
for (int v=0; v<rozmer-1; v++)
submatice[u][v]=matice[u+1][v<i?v:v+1];
det += (i%2?1:-1)*matice[0][i ]*determinant(submatice, rozmer-1);
}
return det;
}
int main() {
double pole[MAX_R][MAX_R]={{1,-2,1,2,4},{3,0,-1,1,-3},{2,2,2,3,5},{-2,-2,0,5,-2},{-2,3,-1,0,-2}};
double det;
det=determinant(pole,5);
printf("Determinant je %f \n", det);
return 0;
}