Funktion von Matrixoperationen
Hm...
- javascript
Hi Leute,
ich muss in meinem Skript mit Matrizen rechnen, möchte die Funktionen dafür aber nicht unbedingt selber schreiben.
Gibt es irgendwo JS Funktionen zum Invertieren, Transponieren und Multiplizieren von Matrizen? Falls ja, wie kann ich die in mein Programm einbinden?
mfg
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
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;
};
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
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;
};
so, der fehler tritt nur auf, wenn ich eine zeile mit besonders hohen werten in der matrix haben... ich werd mal die numeriker aufsuchen