2013-02-19 60 views
9

Các documentation nói:Làm thế nào để chuyển đổi hàng vectơ thành vector cột trong Eigen?

... trong Eigen, vectơ chỉ là một trường hợp đặc biệt của ma trận, với một trong hai 1 hàng hoặc 1 cột. Trường hợp họ có 1 cột là phổ biến nhất; các vectơ như vậy được gọi là cột-vectơ, thường được viết tắt là vectơ chỉ. Trong trường hợp khác, nơi họ có 1 hàng , chúng được gọi là hàng vectơ.

Tuy nhiên chương trình này kết quả đầu ra kết quả unintuitive:

#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; 
} 

Output:

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

Đây có phải là một lỗi, hoặc tôi đang sử dụng thư viện không đúng cách?

+2

tôi đã thêm một khẳng định cho sự phát triển chi nhánh của Eigen để bảo vệ chống lại việc sử dụng (sai) này. –

Trả lời

11

Các tài liệu cho transposeInPlace nói:

Note

nếu ma trận không vuông, sau đó *this phải là một ma trận thay đổi kích thước.

Bạn sẽ cần loại của bạn có cả hàng và cột năng động:

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

Tuy nhiên, có đã là một typedef cho việc này: MatrixXd.

Ngoài ra, nếu bạn vẫn muốn các kích thước thời gian biên dịch, bạn có thể sử dụng tranpose hơn transposeInPlace để cung cấp cho bạn một ma trận hoán mới chứ không phải là thay đổi mục hiện thời:

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

Cảm ơn bạn! Đây chính là nó –

Các vấn đề liên quan