2014-04-05 9 views
6

W MATLAB, linia poniżej konwertuje macierz na wektor. Spłaszcza kolumnę macierzy przez kolumnę do wektora.Eigen Convert Matrix na wektor

myvar(:) 

Jak to zrobić z Eigenem? Rozwiązanie powinno działać dla dowolnego wymiaru macierzy.

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 (:) zajmuje kolumna macierzy ** ** mądry nd umieszcza go w wektorze, a nie w rzędzie. – rayryeng

+0

Tak, dzięki, zaktualizowałem moje pytanie. – user3501255

Odpowiedz

9

Eigen matryce są przechowywane w kolumnie głównej kolejności domyślnie, więc można użyć po prostu użyć EIGEN Mapy do przechowywania kolumny danych przez kolumny w tablicy:

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

Jeśli chcesz dane zamówionej wiersz po wierszu, trzeba najpierw transpozycji macierzy:

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

Innym sposobem na to jest:

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

lub, jeśli chcesz, wektor w kolejności rzędu:

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

Pozdrawiam.

+1

Przypisanie "matrycy" do "wektora" kończy się niepowodzeniem. – YvesgereY

1

Jeśli chcesz zmienić wartości macierzy bez definiowania nowej zmiennej można użyć

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

w tym przypadku danych() [3] będzie odpowiadać indeksu A [1,1] z matrycy, lub czytać im przez

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

więc jeśli piszę całą matrycę 2by3 to będzie jak

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