C
Crymes
Guest
Hallo,
ich bin grad am programmieren einer Matrizenbibliothek in C und hab folgende Struktur:
Und Funktionen mit so einer Signatur (wichtig ist das struct Matrix*)
Jetzt hab ich folgende Funktion zum Berechnen einer Determinante:
Diese Funktion funktioniert auch wenn ich alle Operationen direkt auf meiner MAtrix ausführe, die ich per Pointer übergebe. (Steht grad nicht so im Quelltext)
Ich glaube der Fehler liegt hier:
Wie kann ich das beheben ?
ich bin grad am programmieren einer Matrizenbibliothek in C und hab folgende Struktur:
Code:
struct Matrix
{
float **matrix;
unsigned int numrows;
unsigned int numcolumns;
};
Und Funktionen mit so einer Signatur (wichtig ist das struct Matrix*)
Code:
static void addRows(struct Matrix *M, float factor, unsigned int row1, unsigned int row2)
Jetzt hab ich folgende Funktion zum Berechnen einer Determinante:
Code:
float Matrix_getDeterminant(struct Matrix *Matrix)
{
if(Matrix->numrows != Matrix->numcolumns)
{
return 0;
}
//Matrix in den Stack kopieren
float Mat[Matrix->numrows][Matrix->numcolumns];
for(unsigned int i = 0; i < Matrix->numrows; i++)
{
for(unsigned int j = 0; j < Matrix->numcolumns; j++)
{
Mat[i][j] = Matrix_getValue(Matrix, i, j);
}
}
struct Matrix M;
M.matrix = &Mat;
M.numrows = Matrix->numrows;
M.numcolumns = Matrix->numcolumns;
//Matrix ordnen und Faktor bestimmen
int koeff = (orderRows(&M)%2 == 0)? 1 : -1;
//Gauß Algorithmus
for(unsigned int i=0; i<M.numrows-1; i++)
{
//Stelle des ersten Koeff != 0 bestimmen (wahrscheinlich 0 bei erster Zeile, 1 bei 2. ...)
unsigned int s = 0;
for(unsigned int j=0; j<M.numcolumns; j++)
{
if(M.matrix[i][j] == 0)
{
s++;
}
else
{
break;
}
}
//Alle Zeilen mit gleich viel Koieffs woe Zeile i verkürzen
for(unsigned int j=i+1; j<M.numrows; j++)
{
//Zeile gleich lang wir Zele i?
if(M.matrix[j][s] != 0)
{
//Nun wird diese Zeile verkürzt
float div = M.matrix[i][s] / M.matrix[j][s];
addRows(&M, div, j, i);
//Reihe j hat nun eine Null mehr, wegen numerischen Runduingsfehlern explizit auf 0 setzen
M.matrix[j][s] = 0;
}
else
{
break;
}
}
}
//Matrix hat nun ZSF, Determinante ist Produkt der Hauptdiagonale
float d = 1;
for(unsigned int i=0; i<M.numrows; i++)
{
d *= M.matrix[i][i];
}
d *= koeff;
return d;
}
Ich glaube der Fehler liegt hier:
Code:
M.matrix = &Mat;
Wie kann ich das beheben ?