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!