2014-04-05 16 views
6

In MATLAB, la riga sottostante converte una matrice in un vettore. Appiattisce la matrice colonna per colonna in un vettore.Eigen Convert Matrix to Vector

myvar(:) 

Come si fa con Eigen? La soluzione dovrebbe funzionare per qualsiasi dimensione di Matrix.

MatrixXd A(3,2); 
VectorXd B(6); 
A << 1,2,3,4,5,6; 
B << A.col(0), A.col(1); 
//This isn't general enough to work on any size Matrix 
+0

myvar (:) prende una matrice ** ** colonna saggio una lo colloca in un vettore, non in termini di file. – rayryeng

+0

Sì Grazie, ho aggiornato la mia domanda. – user3501255

risposta

9

Eigen matrici vengono memorizzati nella colonna importante ordine di default, quindi è possibile utilizzare semplicemente utilizzare mappe Eigen per memorizzare la colonna di dati per colonna in un array:

MatrixXd A(3,2); 
A << 1,2,3,4,5,6; 
VectorXd B(Map<VectorXd>(A.data(), A.cols()*A.rows())); 

Se si desidera che i dati ordinati riga per riga, è necessario trasporre la matrice prima:

MatrixXd A(3,2); 
A << 1,2,3,4,5,6; 
A.transposeInPlace(); 
VectorXd B(Map<VectorXd>(A.data(), A.cols()*A.rows())); 
0

Un altro modo per farlo è:

... 
VectorXd B = A; 
B.resize(B.cols()*B.rows(), 1); 

o, se si desidera che il vettore, al fine di fila:

... 
VectorXd B = A.transpose(); 
B.resize(B.cols()*B.rows(), 1); 

saluti.

+1

L'assegnazione di una "matrice" a un "vettore" è destinata a fallire. – YvesgereY

1

Se si desidera modificare i valori della matrice senza definire una nuova variabile è possibile utilizzare

Eigen::MatrixXd A(2,3); 
A.data()[3] = 1.2 

in questo caso i dati() [3] corrisponderà all'indice A [1,1] di matrice, o leggere li da

double value = A.data()[5]; 

quindi se scrivo l'intera matrice 2by3 sarebbe come

A.data()[0]  A.data()[2] A.data()[4] 
A.data()[1]  A.data()[3] A.data()[5]