Hm...: Funktion von Matrixoperationen

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

  1. 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

    1. 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;  
      };
      
      1. 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

        1. 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;
          };

          1. so, der fehler tritt nur auf, wenn ich eine zeile mit besonders hohen werten in der matrix haben... ich werd mal die numeriker aufsuchen