2017-10-25 5 views
0

Sorry für das Thema - Ich konnte kein besseres erstellen ...Wie kann ich eine "Eigen" - Matrix blockweise initialisieren?

Was ich meine ist: Ich habe einen 2D-Vektor a und einen 3D-Vektor b. Wenn ich b initialisieren, b (0,1) sollte a und b (2) eingestellt werden soll Dieser Code funktioniert auf 1 gesetzt werden:

const Vector2d a(1,2); 
    Vector3d b(0,0,1); 
    b.head<2>() = a; 

Aber was würde ich lieber (unter anderem wegen der const):

const Vector2d a(1,2); 
    const Vector3d b(a, 1); 

Dies funktioniert nicht. Gibt es einen Weg, dies zu erreichen?

+1

Ich bin nicht vertraut genug mit Eigen, um eine richtige Antwort zu geben, aber wenn nichts existiert, können Sie immer eine Lambda-Funktion schreiben, die das zurückgibt, was Sie wollen und das Ergebnis davon einer 'const' zuweisen. – Darhuuk

+0

Ich, otoh, bin nicht wirklich vertraut mit Lambdas in C++. Benutzte es nur jetzt oder jetzt. Können Sie mir bitte ein Beispiel für diese Lösung geben? (Es wäre rein akademisch, weil die Antwort unten schon meinen Bedürfnissen entspricht ...) – Markus

Antwort

1

Ohne die const Sie tun würden:

Vector3d b; 
b << a, 1; 

Wenn Sie es wirklich const sein wollen, dann können Sie tun:

const Vector3d b = (Vector3d() << a, 1).finished(); 
+0

Danke, funktioniert perfekt :) Ja, ich benutze const wo immer es vernünftig und möglich ist. – Markus

1

Hier ist, was Sie könnten eine Lambda tun mit (vorausgesetzt, es gibt kein einfacher Weg, um eine Konstruktoraufruf durch):

auto generateB = [&]() -> Vector3d { 
    Vector3d b(0, 0, 1); 
    b.head<2>() = a; 
    return b; 
    }; 

Und dann würden Sie es wie folgt verwendet werden:

Verwandte Themen