Wyznacznik dowolnej wielkości macierzy.

0

Napisać funkcje rekurencyjną liczącą wyznacznik dowolnej wielkości macierzy :d

0

3...2....1... już możesz zaczynać kodzenie skoro znasz treść zadania :)

0

jak bym umiał, właśnie robie ale jeszcze nie wiem czy działa

0

I chciales sie z nami podzielic przemysleniami czy co?

0

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

0
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?

0

A jednak jest błąd, dla dwuwymiarowych działa ale dla pozostałych nie

0

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)

0

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źć.

0
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 :-[

0

http://pastebin.4programmers.net/2921

W C# jakby ktos potrzebowal.

0

Ok kurde sory za posty ale po prostu na kartce źle obliczałem a algorytm był dobry [rotfl]

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1