2014-12-10 4 views
5

E 'piuttosto un compito semplice, ma non è stato in grado di trovare una risposta ad esso:colonna Append alla matrice, utilizzando Eigen libreria

Utilizzando la libreria Eigen, supponiamo di avere Matrix2Xd mat e Vector2d vec, dove

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

Ora ho bisogno di qualcosa come mat.addCol(vec) tale che dopo

mat = 1 1 1 2 
     1 1 1 2 

Qual è il modo migliore (più semplice) per raggiungere questo obiettivo?

Si noti che questo non è un duplicato di How do you make a matrix out of vectors in eigen?. Non voglio inizializzare la matrice ma aggiungerne una esistente. O forse c'è un trucco, come usare l'inizializzazione della virgola in questo caso? Il seguente codice fallirà:

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: I seguenti lavori, ma non mi piace la necessità di una variabile temporanea per un compito così semplice. C'è un modo migliore?

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

hai letto la prima risposta della vittima: "La matrice m mus sono stati correttamente ridimensionata prima."? Una matrice Eigen ha una funzione ['ridimensiona'] (http://eigen.tuxfamily.org/dox/classEigen_1_1PlainObjectBase.html#afbbb33d14fe7fb9683019a39ce1c659d) membro ... La documentazione può essere cercata, o letta, almeno. – rubenvb

+1

@rubenvb 'resize' non mantiene il contenuto della matrice. Se eseguo 'mat.resize (2, mat.cols() + 1);', la matrice viene riempita con alcuni valori casuali in seguito. – luator

+0

Quindi dovrai creare un temporaneo o inizializzarlo alla dimensione corretta. – rubenvb

risposta

9

È possibile utilizzare conservativeResize a tal fine:

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

Grazie, funziona. Ho capito che è anche possibile scrivere 'mat.conservativeResize (NoChange, mat.cols() + 1);' che lascia invariato il numero di righe. – luator