Matrizenmultiplikation



  • Hallo zusammen,

    bin gerade an meiner Diplomarbeit am Tüfteln (Wirtschafsmathe) und muss nun nen Code in C++ schreiben (mithilfe Numerical Recipes und so).

    Dafür muss ich nun ne Matrizenmultiplikationsfunktion schreiben. Aber irgendwie gibt die mir mit g=(-10,-10,-10)* G=2* (Einheitsmatrix(3)) anstatt -20 -20 -20
    -5 -5 -5 aus...
    Naja,ich poste mal den Code:

    MatDoub MM(MatDoub lhs,MatDoub rhs)
        {int lhsrow,lhscol,rhsrow,rhscol,a=0;
        lhsrow=lhs.nrows();
        lhscol=lhs.ncols();
        rhsrow=rhs.nrows();
        rhscol=rhs.ncols();    
        if (lhscol!=rhsrow)
        {cout<<"Matrixmultiplikation nicht möglich!\n";}
        MatDoub Ergebnis(lhsrow,rhscol,a);
        for (int i=0;i<lhsrow;i++)
        {    for (int j=0;j<rhscol;j++)
             {     for (int k=0;k<lhscol;k++)
                   {   Ergebnis[i][j]+=lhs[i][k]*rhs[k][j];
                   }               
             }     
        }      
        return Ergebnis;
        }
    

    Dabei bezeichnen MatDoub eine Matrix mit Doubleeinträgen und nrows() ist die Funktion für die Zeilen bzw. Spalten.
    Edit: Der Konstruktor macht ne Matrix mit nur Nullen =a.
    Warum kommt da nur die Hälfte raus? Hab den Code auch nach VBA gemacht und verglichen - da passts!

    Ich hoffe, ihr könnt mir helfen...

    Machs gut,
    Noah



  • Hat sich erledigt... 😃
    Habe die Matrix irgendwie vorher auf 0.5 und so geändert gehabt...

    Naja, guten Tag noch!



  • Noah schrieb:

    geändert gehabt...

    😡 😮 🙄 😞 👎



  • Ein paar Anmerkung hätte ich noch:

    Noah schrieb:

    MatDoub MM(MatDoub lhs,MatDoub rhs)
    

    Nimm hier die Parameter als ref-to-const ( MatDoub const& lhs ,...)

    Noah schrieb:

    int lhsrow,lhscol,rhsrow,rhscol,a=0;
        lhsrow=lhs.nrows();
        lhscol=lhs.ncols();
        rhsrow=rhs.nrows();
        rhscol=rhs.ncols();
    

    Warum nicht gleich initialisieren? Die Variable a ist auch irgendwie sinnlos. Fängst Du auch den Fall lhscol!=rhsrow ab?

    int n1 = lhs.nrows();
        int n2 = lhs.ncols();
        int n3 = rhs.ncols();
        if (n2!=rhs.nrows()) throw std::runtime_error("wtf?!");
    

    Noah schrieb:

    for (int i=0;i<lhsrow;i++)
        {    for (int j=0;j<rhscol;j++)
             {     for (int k=0;k<lhscol;k++)
                   {   Ergebnis[i][j]+=lhs[i][k]*rhs[k][j];
    

    Hier würde ich noch eine Variable "tmp" einfügen und mit Null initialisieren, "tmp += ..." schreiben und das Ergebniss dann nach "Ergebnis[i][j]" reinschreiben. Je nachdem, wie Du operator[] implementiert hast, könnte überflüssig Zeit kosten, immer eine Referenz auf dasselbe Objekt zu holen.

    Gruß,
    SP



  • Kóyaánasqatsi schrieb:

    Noah schrieb:

    geändert gehabt...

    😡 😮 🙄 😞 👎

    Das würd ich noch als Dialekt anerkennen. 😉



  • Kóyaánasqatsi schrieb:

    Noah schrieb:

    geändert gehabt...

    😡 😮 🙄 😞 👎

    rheinisches perfekt...



  • 😃 Jo,Rheinland mit Ruhrpottflavour...

    Danke für die Tipps, werde ich in die Tat umsetzen!


Anmelden zum Antworten