Matrizenmultiplikation



  • Hallo, benötigt man für die Matrizenmultiplikation immer die Definition einer Klasse oder kann man diese auch alleine durch Arrays durchführen?

    Ich habe es mit Arrays versucht, bekomme aber immer die Fehlermeldung:

    error C2109: Index erfordert ein Array oder einen Zeigertyp

    Hier mein C++-Code:

    double invKalibriermatrix [3][3]={{0.001,0,0},{0,0.001,0},{0,0,1}};
    double Bildvektor [3][1]={{0.455},{31.365},{1}};
    
    int m [3][1];
    int summe=0;
    
    for (int l=0; l<3;l++)
    {
    	for (int i=0; i<1; i++)
    	{
    		for (int k=0; k<3; k++)			
    		{
    			m[l][i]=invKalibriermatrix[l][k] * Bildvektor[k][i];
    
    			summe += m[l][i];
    		}
    	}
    }
    

    Wo ist mein Fehler? Wenn es alleine mit Arrays nicht funktioniert, wie muss ich dann vorgehen?



  • Eigentlich sollte es auch mit Arrays funktionieren. An welcher Stelle meldet der Compiler denn den Fehler?

    (btw, dein Code hat nicht viel mit Matrizen-Multiplikation zu tun. Und eine Schleife "for (i=0;i<1;++i)" wird genau einmal durchlaufen ;))



  • @ CStoll: Der Fehler ist in der Zeile 10.



  • Kann es daran liegen, dass ich am Anfang die Matrizen als double definiert habe?



  • Jetzt müsste man nur noch herausfinden, auf welchen der *nachzählt* sechs Index-Zugriffe in der Zeile sich die Meldung bezieht. In den Code-Ausschnitten kann ich eigentlich keinen Fehler erkennen, aber eventuell ist der Compiler ja anderer Meinung als du, was sich hinter den Bezeichnern invKalibriermatrix und Bildvektor verbirgt.



  • @CStoll: das könnte auch ein "l" (kleines L) sein und keine "eins" ... Und schon sieht der Code ganz anders aus. Deswegen meide ich auch das kleine L... 😃



  • ich hab jetzt einfach alles nochmal mit einfachen Zahlenbeispielen ausprobiert:

    int a[3][3]={{1,1,1},{1,1,1},{1,1,1}};
    int b[3][1]={{2},{2},{2}};
    int c[3][1];
    int summe=0;
    
    for (int l=0; l<3;l++)
    {
    	for (int i=0; i<1; i++)
    	{
    		for (int k=0; k<3; k++)			
    		{
    			c[l][k]=a[l][k] * b[k][i];
    			summe += c[l][k];
    		}
    	}
    }
    
    for (int l = 0; l < 3; l++)
    {
    	for (int k = 0; k < 1; k++)
    		cout << c [l] [k] << " ";
    		cout << endl;
    }
    

    Jetzt läuft es, aber es muss immer noch ein Fehler da sein. Das Ergebnis stimmt nicht. Zeile 13 rechnet falsch zusammen.



  • It0101 schrieb:

    Deswegen meide ich auch das kleine L... 😃

    Deswegen meide ich schlechte Schriftarten. 🤡



  • schildi28 schrieb:

    Jetzt läuft es, aber es muss immer noch ein Fehler da sein. Das Ergebnis stimmt nicht. Zeile 13 rechnet falsch zusammen.

    Ich hab' dir schon vorhin gesagt, daß der Code herlich wenig mit Matrizen-Multiplikation zu tun hat. Du mußt in der innersten Schleife alle Teile aufsummieren und am Ende in die Zielmatrix schreiben.
    (und achte darauf, welche Werte du wie miteinander verrechnest)



  • Vor kurzem habe ich mich mit ebenfalls mit der Multiplikation von Matrizen beschäftigt. Hieraus ist allerdings eine (Template-)Klasse entstanden, welche ebenfalls die dreifach verschachtelte Schleifenstruktur verwendet.

    Vielleicht kannst du etwas davon gebrauchen (in der Hoffnung, ich habe keinen Schmu produziert 😉 ).

    Grüße ...



  • Danke.

    Jetzt funktioniert es.

    Hab auch meinen Anfangsfehler gefunden. Hatte meine erste Matrix in einer anderen void Funktion definiert. Daher konnte es nicht funktionieren.

    🙂


Log in to reply