Napisać funkcje rekurencyjną liczącą wyznacznik dowolnej wielkości macierzy :d
3...2....1... już możesz zaczynać kodzenie skoro znasz treść zadania :)
jak bym umiał, właśnie robie ale jeszcze nie wiem czy działa
I chciales sie z nami podzielic przemysleniami czy co?
właśnie nie bo wiedziałem że i tak mi nie wyjdzie tak że nie chciałem tracić czasu na czekanie po tym jak napisałem źle
public float det(float[][] matrix,int dimension){
float buff[][];
float whatReturn=0;
if(dimension==1){
return matrix[0][0];
}else{
buff = new float[dimension-1][dimension-1];
for(int i=0;i<dimension;i++){
for(int j=0;j<dimension-1;j++){
for(int k=0;k<dimension-1;k++){
buff[j][k]=matrix[j<i?j:j+1][k+1];
}
}
if((1+i)%2!=0){
whatReturn+=matrix[i][0]*det(buff,dimension-1);
}else{
whatReturn-=matrix[i][0]*det(buff,dimension-1);
}
}
return whatReturn;
}
}
Tak chyba działa?
A jednak jest błąd, dla dwuwymiarowych działa ale dla pozostałych nie
na pierwszy rzut oka widać że to nie będzie działać :P złożoność nie ta :P
najprościej permutacje (n!), albo laplace + spamiętywanie (wykładniczo)
Nie wiem dokładnie o co ci chodzi ale ta funkcja jest zrobiona na podstawie definicji rekurencyjnej wyznacznika czyli w przybliżeniu rozwinięciu Laplace'a, jest tam jakiś błąd najprawdopodobniej z iteracją lub z tworzeniem dopełnień algebraicznych ale coś nie mogę znaleźć.
public static float det(float[][] matrix,int dimension){
float buff[][];
float whatReturn=0;
//jeżeli pierwszego stopnia czyli skalar to zwróć jego wartość
if(dimension==1){
return matrix[0][0];
}else{
//macierz dopełnienia algebraicznego
buff = new float[dimension-1][dimension-1];
//rozwinięcie Laplace'a względem pierwszego wiersza
for(int i=0;i<dimension;i++){
//przepisanie do buff rozwinięcia algebraicznego
for(int j=0;j<dimension-1;j++){
for(int k=0;k<dimension-1;k++){
buff[j][k]=matrix[j+1][k<i?k:k+1];
}
}
//zgodnie z rozwinieciem Laplace'a trzeba zsumować wartosci poszczególnych komórek w wierszu
//pomnożone przez wyznaczniki ich rozwinięc algebraicznych oraz pomnożone przez (-1)^i+j
if(i%2==0){
whatReturn+=matrix[0][i]*det(buff,dimension-1);
}else{
whatReturn-=matrix[0][i]*det(buff,dimension-1);
}
}
return whatReturn;
}
}
Co tu jest źle :-[ zaraz coś mnie trafi :-[
http://pastebin.4programmers.net/2921
W C# jakby ktos potrzebowal.
Ok kurde sory za posty ale po prostu na kartce źle obliczałem a algorytm był dobry [rotfl]
PS. jak dajecie jakiś kod na pastebin, który potem użyjecie na forum to ustawcie wygasanie:nigdy, bo potem za dwa dni już nikt go nie zobaczy.
kod Wolverina: http://pastebin.4programmers.net/2938