Matrixen Multiplikation



  • Hallo,

    für meine Anwendung habe ich mir eine einfache Matrix Klasse geschrieben, wo ich mir eine Matrix anlegen kann, Werte lesen, Werte schreiben und Matrix anzeigen.

    Nun habe ich in meiner Anwendung 2 Matrixne angelegt, gefüllt und möchte diese gerne multiplizieren. Ich habe das ganze mal versucht zu implementieren, komme mit den inzwischen 4 verschachtelten arrays völlig durcheinander 😞

    Es handelt sich hier um C++ Builder Code, aber den sollte jeder C++ Programmier verstehen können 🙂

    Die beiden Funktionen meiner Matrix Klasse

    setValue(Y Achse, X Achse, Wert)
    getValue(Y Achse, X Achse)

    ...
    TMatrix * m1 = new TMatrix(2, 3);
    m1->setValue(0, 0, 1);
    m1->setValue(0, 1, 2);
    m1->setValue(0, 2, 3);
    m1->setValue(1, 0, 4);
    m1->setValue(1, 1, 5);
    m1->setValue(1, 2, 6);
    
    /*
    entspricht:
    1  2  3
    4  5  6
    */
    
    TMatrix * m2 = new TMatrix(3, 2);
    m2->setValue(0, 0, 6);
    m2->setValue(0, 1, -1);
    m2->setValue(1, 0, 3);
    m2->setValue(1, 1, 2);
    m2->setValue(2, 0, 0);
    m2->setValue(2, 1, -3);
    
    /*
    entspricht:
    6  -1
    3  2
    0  -3
    */
    
    // die größe der ergebnis matrix ist bekannt
    TMatrix * m3 = new TMatrix(2, 2);
    
    // nun die multiplikation durchführen
    multiplyMatrix(m1, m2, m3);
    
    ...
    
    // m3 = m1*m2
    void __fastcall TForm2::multiplyMatrix(TMatrix *m1, TMatrix *m2, TMatrix *m3)
    {
       for (int x = 0; x < m3->getXSize(); x++)
       {
          for (int y = 0; y < m3->getYSize(); y++)
          {
             // calculate value
             double sum = 0.00;
    
    	for (int y1 = 0; y1 < m1->getYSize(); y1++)
    	{
    	   for (int x1 = 0; x1 < m2->getXSize(); x1++)
    	   {
    	      sum += m1->getValue(y1, x) * m2->getValue(y, x1);
    	   }
    	}
    
    	m3->setValue(y, x, sum);
          }
       }
    }
    

    Ich weiß, dass es nicht schön aufgebaut ist. Normalerweise würde man die Matrix Klasse umbauen, dass sich diese um den Multiplikationsschritt kümmert. Das baue ich ggf. später ein.

    Es geht mir hier nur um die Berechnung. Mein Ansatz ist, dass ich erstmal die Ergebnis Matrix ablaufe. Deren größe ist mir ja bereits bekannt.

    Nun versuche ich von M1 und M2 je die Zeile mit der Spalte zu multiplizieren. Und das ist meiner Meinung nach der Schritt wo irgendwas schiefläuft. Mir sind das fast auch schon zu viele Schleifen, dass ich da durcheinander bin 🙂

    Sieht jemand auf Anhieb Probleme?

    Phil



  • Du multiplizierst nicht die entsprechende Zeile von m1 mit der entsprechenden Spalte von m2, sondern nimmst die Spalte von m1 und die Zeile von m1 🙂



  • hi,

    danke für den hinweis.

    musste mir das problem nochmal aufzeichnen und die rechenschritte ausgeben lassen. damit konnte ich das problem lösen und eine schleife dabei auch kicken 🙂

    auch noch ein kleines if else eingebaut, damit egal ist welche matrix zuerst eingegeben wird, da gabs vorher noch probleme 🙂

    phil


Log in to reply