2013-02-19 11 views
9

documentation mówi:Jak przekonwertować wektor wiersza na wektor kolumny w Eigen?

... w Eigena, wektory tylko szczególnym przypadkiem matryc, z każdym rzędem 1 lub 1 kolumny. Przypadek, w którym kolumny mają 1 , jest najbardziej rozpowszechniony; takie wektory nazywane są wektorami kolumnowymi, , często określanymi skrótem jako wektory. W drugim przypadku, gdy mają wiersz 1 , są one nazywane wektorami wierszowymi.

ten program wyjścia Wyniki nieintuicyjne Jednakże:

#include <eigen3/Eigen/Dense> 
#include <iostream> 

typedef Eigen::Matrix<double, 1, Eigen::Dynamic> RowVector; 

int main(int argc, char** argv) 
{ 
    RowVector row(10); 
    std::cout << "Rows: " << row.rows() << std::endl; 
    std::cout << "Columns: " << row.cols() << std::endl; 
    row.transposeInPlace(); 
    std::cout << "Rows: " << row.rows() << std::endl; 
    std::cout << "Columns: " << row.cols() << std::endl; 
} 

wyjściowa:

Rows: 1 
Columns: 10 
Rows: 1 
Columns: 10 

Jest to błąd, czy używam biblioteki nieprawidłowo?

+2

I dodaje dochodzić do rozwoju gałąź Eigena, aby chronić się przed tym (niewłaściwym) użyciem. –

Odpowiedz

11

Dokumentacja transposeInPlace mówi:

Uwaga

gdy matryca nie jest kwadratowy, a następnie *this musi być skalowalny macierzy.

Musisz typ mieć zarówno dynamicznych wierszy i kolumn:

Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> 

Jednak istnieje już typedef na to: MatrixXd.

Alternatywnie, jeśli nadal chcesz rozmiary kompilacji, można użyć tranpose zamiast transposeInPlace dać nową transpozycję macierzy zamiast modyfikować aktualna:

typedef Eigen::Matrix<double, Eigen::Dynamic, 1> ColumnVector; 
ColumnVector column = row.transpose(); 
+1

Dziękujemy! To jest to –