Ich muss eine Koordinatentransformation zwischen zwei Referenzsystemen (Achsen) durchführen. Dafür müssen drei Matrizen ( ) multipliziert werden, da einige Zwischenachsen verwendet werden. Ich habe über zwei Lösungsansätze nachgedacht:
Methode 1 : Die Multiplikation direkt durchführen,
Methode 2 : In Schritte aufteilen:
wo:
R 2 R 3 3 × 3 , und sind Matrizen
v i v 3 i v 23 3 × 1 , , , sind Vektoren
Ich würde gerne wissen, welche Methode rechnerisch effizienter ist (weniger Zeit), um die Transformation durchzuführen (dies wird häufig durchgeführt).
matrix
performance
matlab
julianfperez
quelle
quelle
Antworten:
Matlab interpretiert Sequenzen von Multiplikationen und / oder Divisionen von links nach rechts. Daher ist viel teurer als , da Sie zwei Matrixprodukte und ein Matrix-Vecor-Produkt anstelle von drei Matrix-Vektor-Produkten haben.A ∗ ( B ∗ ( C ∗ v ) )A∗B∗C∗v A∗(B∗(C∗v))
Andererseits sollte etwas schneller sein, als wenn Sie die Zwischenprodukte in separaten Vektoren speichern, wie Ihre zweite Methode vorschlägt.A∗(B∗(C∗v))
Um allgemein herauszufinden, wie die Auswirkungen kleiner Programmierunterschiede auf große Berechnungen gemessen werden können, schreiben Sie an die Matlab-Eingabeaufforderung "Hilfsprofil".
quelle
Für den Anfang würde ich keine Zwischenvariablen verwenden, sondern Klammern. Es sei denn natürlich, Sie interessieren sich für die Zwischenergebnisse, aber ich vermute nicht.
Ich habe in Matlab Folgendes versucht:
Ich muss jedoch sagen, dass dies ziemlich beängstigend ist. Ich bin immer davon ausgegangen, dass Matlab bei der Matrixmultiplikationsreihenfolge klug ist, da dies ein bekanntes Problem mit einfachen und effizienten Lösungen ist.
quelle
Da die Matrizen so klein sind, werden alle Kosten im Anrufaufwand anfallen. Wenn Sie die Transformation mehrmals durchführen, ist es schneller, sie
D=A*B*C
einmal vorab zu berechnen und dann für jeden Vektor anzuwendenv_f=D*v_i
. Sie können dies auch in eine mex-Datei aufnehmen.quelle