2014-12-10 15 views
5

Es ist eine ziemlich einfache Aufgabe, aber ich war nicht in der Lage eine Antwort darauf zu finden:Anfügen Spalte zur Matrix, mit Eigen-Bibliothek

die Eigen-Bibliothek verwenden, nehme ich Matrix2Xd mat und Vector2d vec, wo

mat = 1 1 1 
     1 1 1 
vec = 2 2 

Jetzt brauche ich so etwas wie mat.addCol(vec), so dass danach

mat = 1 1 1 2 
     1 1 1 2 

Was ist der beste (einfachste) Weg, dies zu erreichen? Bitte beachten Sie, dass dies kein Duplikat von How do you make a matrix out of vectors in eigen? ist. Ich möchte nicht zuerst die Matrix konstruieren, sondern an eine bestehende anhängen. Oder gibt es vielleicht einen Trick, wie man in diesem Fall die Komma-Initialisierung benutzt? Der folgende Code wird fehlschlagen:

Matrix2Xd mat(2,3); 
Vector2d vec; 
mat << 1, 1, 1, 1, 1, 1; 
vec << 2, 2; 

cout << mat << endl; 
mat << vec;    // <-- crashes here 
cout << mat << endl; 

Edit: Folgende Arbeiten, aber ich weiß nicht, wie die Notwendigkeit einer temporären Variablen für eine solche grundlegende Aufgabe. Gibt es einen besseren Weg?

Matrix2Xd tmp(2, mat.cols()+1); 
tmp << mat, vec; 
mat = tmp; 
+1

Sie die erste Antwort in der Betrogene gelesen haben: "Die Matrix m Mus richtig erste Größe verändert wurde."? Eine Eigenmatrix hat eine ['resize'] (http://eigen.tuxfamily.org/dox/classEigen_1_1PlainObjectBase.html#afbbb33d14fe7fb9683019a39ce1c659d) Elementfunktion ... Die Dokumentation kann gegoogelt oder zumindest gelesen werden. – rubenvb

+1

@rubenvb 'resize' behält den Inhalt der Matrix nicht bei. Wenn ich 'mat.resize (2, mat.cols() + 1);' mache, wird die Matrix danach mit einigen zufälligen Werten gefüllt. – luator

+0

Dann müssen Sie entweder ein temporäres erstellen oder es auf die richtige Größe initialisieren. – rubenvb

Antwort

9

Sie conservativeResize zu diesem Zweck verwenden können:

mat.conservativeResize(mat.rows(), mat.cols()+1); 
mat.col(mat.cols()-1) = vec; 
+3

Danke, das funktioniert. Ich habe herausgefunden, dass es sogar möglich ist, 'mat.conservativeResize (NoChange, mat.cols() + 1);' zu schreiben, wodurch die Anzahl der Zeilen unverändert bleibt. – luator

Verwandte Themen