Hm...: Funktion von Matrixoperationen

Beitrag lesen

Hi Leute,

ich habe gerade ein merkwürdiges Programmierproblem:

var produkt=this.multMatrix(transponiert2,matrix);

var produkt2=new Array();
for(var i=0;i<produkt.length;i++){
produkt2[i]=new Array();
for(var j=0;j<produkt[0].length;j++){
produkt2[i][j]=produkt[i][j];
}
}

var b=this.invertiere(produkt2);

var test=this.multMatrix(b,produkt);

b ist die inverse von "produkt", aber trotzdem ist "test" selbst nach rundung keine einheitsmatrix, nur die erste zeile. die matrix "produkt" (array von arrays) ist 28x28 groß.

Kann es sein, dass ich hier irgendwo einen kopier fehler oder ähnliches gemacht habe? Eventuell mache ich einen rundungsfehler, welcher bei großen matrizen für falsche ergebnisse sorgt?

Diese beiden Funktionen wurden dabei verwendet, wurden aber von mir bis zu 5x5 getestet:

this.invertiere=function(matrix){

//initialisiere inverse
var inverse=new Array();
for(var i=0; i<matrix.length;i++){
inverse[i]=new Array();
for(var j=0;j<matrix[0].length;j++){
if(i==j) inverse[i][j]=1;
else inverse[i][j]=0;
}
}
//durchlaufe alle zeilen der matrix
for(var z=0;z<matrix.length;z++){
//tausche zeile z mit der zeile maxInd, welche größten eintrag in spalte z hat
var maxInd=z;
for(var m=z;m<matrix.length;m++){
if(Math.abs(matrix[maxInd][z])<Math.abs(matrix[m][z])) maxInd=m;
}
var hilfsA=matrix[maxInd];
matrix[maxInd]=matrix[z];
matrix[z]=hilfsA;

hilfsA=inverse[maxInd];
inverse[maxInd]=inverse[z];
inverse[z]=hilfsA;

//jetzt setze matrix[z][z]=1
var koff=matrix[z][z];
//teile dafuer die zeile z von inverse und matrix durch koff
for(var s=0;s<matrix[z].length;s++){
inverse[z][s]=inverse[z][s]/koff;
matrix[z][s]=matrix[z][s]/koff;
}
//jetzt sorge dafuer das in der spalte unter und ueber matrix[z][z] ueberall 0 steht, rechnung auf inverse uebertragen
for(var zl=0;zl<matrix.length;zl++){
if(zl!=z){koff=matrix[zl][z];
for(var sl=0;sl<matrix[0].length;sl++){
inverse[zl][sl]=inverse[zl][sl]-inverse[z][sl]*koff;
matrix[zl][sl]=matrix[zl][sl]-matrix[z][sl]*koff;

}
}
}

}
return inverse;
};

this.multMatrix=function(m1,m2){

var m=new Array();
//initialisiere matrixprodukt
for(var i=0; i<m1.length;i++){
m[i]=new Array();
for(var j=0;j<m1.length;j++){
m[i][j]=parseFloat(0);
}
}

for(var i=0; i<m1.length;i++){
for(var j=0;j<m2[0].length;j++){
for(var k=0;k<m1[0].length;k++){
m[i][j]=m[i][j]+parseFloat(m1[i][k])*parseFloat(m2[k][j]);

}
m[i][j]=Math.round(100*m[i][j])/100;
}
}

return m;
};