Moin,
Gibt es irgendwo JS Funktionen zum Invertieren, Transponieren und Multiplizieren von Matrizen? Falls ja, wie kann ich die in mein Programm einbinden?
Guck mal hier: http://sylvester.jcoglan.com/
Grüße Marco
danke, ich schau mal
ich hab das hier zusammengeschrieben und für 3x3 matrizen getestet, leider funktioniert es bei meiner großen matrix nicht richtig. sieht jemand den fehler? ^^
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;
};zum testen habe ich das hier verwendet:
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;
};
sollte stimmen, habs nochmal getestet, mein fehler liegt wo anders