[JS]Skrypt liczący wyznacznik macierzy - najlepszy sposób

0

Witam!
Napisałem ostatnio mały skrypt służący do obliczania wyznacznika z macierzy dowolnego rozmiaru. Sam algorytm wymyslilem "z głowy", nie korzystalem z zadnych źródeł więc pewnie moj algorytm nie jest najszybszy/najlepszy ;-P Dlatego mam pytanie jaki jest optymalny na to sposób?? Tutaj daje mój algorytm:

function wyznacznik(macierz){
	var a;
	var wynik = 0;
	
	if(macierz.length == 1) return macierz[0][0];
	for(a = 0;a < macierz[0].length;a++){
		var znak = 1;
		if(a%2!=0) znak = -1;
		var mnoznik = macierz[0][a];
		var b;
		var c;
		var m = new Array();
		var m2 = new Array();
		for(b=1;b < macierz.length; b++){
			var d = 0;
			for(c=0;c < macierz[b].length-1; c++){
				if(c==a) d = 1;
				m2[c] = macierz[b][c+d];
				}
			m[b-1]= m2;
			m2 = new Array();
			}
		wynik += znak * mnoznik * wyznacznik(m);
		}
	return wynik;
	}

Funkcja rekurencyjna, pobiera jako argument tablice dwuwymiarową.
Sam skrypt w akcji http://www.naruto-maniak.cba.pl/JS/macierze.html

Czy można to zrobić lepiej? Jest jakiś lepszy algorytm? Czy juz nie da sie tego przyspieszyc? Przy moim rozwiązaniu liczenie z macierzy 10x10 trwa koszmarnie długo...

Pozdrawiam

0

Wiem, że moja odpowiedź to spam, ale po jaką cholerę pisać taką funkcję w JavaScripcie :-D

0
kaziuuu napisał(a)

Wiem, że moja odpowiedź to spam, ale po jaką cholerę pisać taką funkcję w JavaScripcie :-D

Skoro pisze to w java scripcie to znaczy ze mam powód :> Chodzi o to zeby skrypt działał na moim telefonie w którym mam zainstalowaną Opere, jak i na komputerze

0

A w javie na twojej komórce by nie chodziło, działało by o wiele szybciej :-) Cos mi się zdaje, że zaliczenie niedługo z algebry :> a jak wiadomo liczenie wyznaczników jest wyjątkowo błędorodne :d

public static 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+1][k<i?k:k+1];
                                }
                        }
                        if(i%2==0){
                                whatReturn+=matrix[0][i]*det(buff,dimension-1);
                        }else{
                                whatReturn-=matrix[0][i]*det(buff,dimension-1);
                        }
                }
                return whatReturn;
        }
}
0

Metoda CHIO, poszukaj w google czy gdzieś tam. Jest bardziej wydajna niż rekurencyjna, ale podobno są lepsze algorytmy. Tak mi powiedział nauczyciel od matematyki jak go zapytałem dlaczego nic nie wspomniał o tej metodzie, skoro jest łatwa do implementacji. No tylko, że nie powiedział co jest lepsze od CHIO.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.