2017-06-06 10 views
4

Aus Gründen der Flexibilität lade ich Daten in dynamisch große Matrizen (z. B. Eigen::MatrixXf) unter Verwendung der C++ - Bibliothek Eigen. Ich habe einige Funktionen geschrieben, die Matrizen gemischter oder fester Größe als Parameter benötigen (z. B. Eigen::Matrix<float, 3, Eigen::Dynamic> oder Eigen::Matrix4f). Angenommen, ich mache die richtigen Behauptungen für Zeilen- und Spaltengröße, wie kann ich die dynamische Matrix (zur Laufzeit festgelegte Größe) in eine feste Matrix konvertieren (Größe, die zur Kompilierungszeit gesetzt wird)?Umwandeln der dynamischen Matrix in eine feste Matrix in Eigen

Die einzige Lösung, die ich denken kann, ist es auf der Karte, zum Beispiel:

Eigen::MatrixXf dyn = Eigen::MatrixXf::Random(3, 100); 
Eigen::Matrix<float, 3, Eigen::Dynamic> fixed = 
    Eigen::Map<float, 3, Eigen::Dynamic>(dyn.data(), 3, dyn.cols()); 

Aber es ist mir nicht klar, ob das wird entweder arbeiten, weil das feste Größe Karte Konstruktor akzeptiert keine Zeilen und Spalten als Parameter in the docs. Gibt es eine bessere Lösung? Die Zuweisung von Dynamic zu Matrizen mit fester Größe funktioniert nicht.

+1

mit dynamischer Größe für Flexibilität und dann Casting auf feste Größe zum Aufruf einer Funktion klingt wie ein Widerspruch. Brauchen Sie wirklich die Eingabe als dynamische Größe? Ich meine jedenfalls deine Funktion scheint eine bestimmte Größe zu erwarten ... – user463035818

+0

@ tobi303: Der Grund ist, dass ich die gleiche Ladefunktion für verschiedene Datensammlungen benutze. Dann, abhängig von den Daten, die ich geladen habe, rufe ich die Verarbeitungsfunktion auf, die die gemischte oder feste Größe als Parameter benötigt (wegen typedefs). – marcman

+0

Ja, das sollte funktionieren. Nicht, dass es in neueren Versionen (mindestens ab 3.2.9) möglich wäre, dies zu tun, ohne 'Eigen :: Map' zu verwenden. – m7913d

Antwort

5

Sie Ref zu diesem Zweck verwendet werden können, ist es Nutzung in Ihrem Fall ist einfacher, und es wird die Laufzeit Behauptung überprüft für Sie tun, zum Beispiel:

MatrixXf A_dyn(4,4); 
Ref<Matrix4f> A_fixed(A_dyn); 

Sie könnten sogar einen festen Außen Schritt erfordern und ausgerichteten Speicher:

Ref<Matrix4f,Aligned16,OuterStride<4> > A_fixed(A_dyn); 

In diesem Fall A_fixed ist wirklich wie ein Matrix4f.

Verwandte Themen