Vektor-Matrix-Produkt mit Eigen



  • ich möchte ein Vektor-Matrix-Produkt mit Eigen berechnen
    ich bekomme aber bei meinen Versuchen immer nur INVALID_MATRIX_PRODUCT

    in Wolframalpha: Vektor-Matrix-Produkt

    #include <Eigen/Dense>
    int main()
    {
      Eigen::Matrix3d m; // ist eine rotations matrix
      Eigen::Vector3d v; // ist ein Point(x,y,z)
      //auto vector_matrix_product = v * m;
      return 0;
    }
    

    kann mir jemand sagen wie ich mit Eigen das Vektor-Matrix-Produkt bekommen?



  • Willst du nicht eher "m * v"?



  • Das waere ja dann ein matrix vector produkt und nicht ein vector matrix produkt

    Siehe "Vektor mal Matrix"
    https://de.m.wikipedia.org/wiki/Matrizenmultiplikation



  • Ich glaube das ist die Lösung
    Eigen möchten gerne einen Zeilen-Vektor vorgegeben bekommen und nicht einfach einen Vector3d

    #include <Eigen/Dense>
    int main()
    {
    Eigen::Matrix3d m; // ist eine rotations matrix
    Eigen::RowVector3d v; // ist ein Point(x,y,z)
    Eigen::RowVector3d a = v * m;
    return 0;
    }



  • im meinem 1. Beispiele wäre das wohl dann

    Eigen::Matrix3d m;
    Eigen::Vector3d v;
    Eigen::Vector3d vector_matrix_product = (v.transpose() * m).transpose();
    


  • Gast3 schrieb:

    Eigen möchten gerne einen Zeilen-Vektor vorgegeben bekommen und nicht einfach einen Vector3d

    Beachte, dass das davon abhängt, ob du den Vektor bei der Multiplikation auf der linken oder auf der rechten Seite stehen hast.
    Ein Vektor ist eigentlich nichts anderes als eine 1×n1 \times n- oder eine m×1m \times 1-Matrix für welche die üblichen Regeln für die Multiplizierbarkeit
    zweier Matrizen gelten: Spaltenzahl der linken und Zeilenzahl der rechten Seite müssen übereinstimmen.

    Beachte auch dass Matrizenmultiplikation nicht kommutativ ist, und solche Transformationsmatrizen im Allgemeinen so definiert sind,
    dass die Transformation so wie beschrieben durchgeführt wird, wenn man den Vektor auf der rechten Seite der Multiplikation stehen hat.
    Bei deiner Rotationsmatrix wird das z.B. den Effekt haben, dass der Vektor in die entgegengesetzte Richtung rotiert wird, als du vielleicht
    erwartest (Da in deinem Fall vTM=(MTv)Tv^TM = (M^Tv)^T und für Rotationsmatrizen MT=M1M^T=M^{-1}, also die inverse Rotation). Wenn du genau weisst,
    weshalb du von links multiplizierst dann will ich nichts gesagt haben 😉

    Gast3 schrieb:

    #include <Eigen/Dense>
      //auto vector_matrix_product = v * m;
    

    Noch eine Anmerkung: Zwar kenne ich Eigen nicht, aber du solltest mal in der Doku recherchieren ob du hier tatsächlich auto verwenden kannst.
    Oft verwenden solche Bibliotheken nämlich sog. Expression Templates und die Multiplikation könnte ein Proxy-Objekt zurückliefern, welches Referenzen
    auf die (moglicherweise temporären) Operanden hält und das evtl. nicht dafür ausgelegt ist, außerhalb von temporären Ausdrücken instanziert zu werden.



  • Wenn du genau weisst,
    weshalb du von links multiplizierst dann will ich nichts gesagt haben 😉

    ich weiss...

    und danke für deine Anmerkung - ich prüf das mal



  • ich prüf das mal

    https://eigen.tuxfamily.org/dox/TopicPitfalls.html

    genau wie du gesagt hast


Log in to reply