...在Eigen中,向量只是一个特例 矩阵,有1行或1列。他们有1的情况 列是最常见的;这种向量称为列向量, 通常缩写为矢量。在另一种情况下,他们有1 行,它们被称为行向量。
然而,该程序会输出不直观的结果:
#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;
}
输出:
Rows: 1
Columns: 10
Rows: 1
Columns: 10
这是一个错误,还是我错误地使用了库?
答案 0 :(得分:12)
transposeInPlace
的文档说:
注意
如果矩阵不是方形,则
*this
必须是可调整大小的矩阵。
您需要您的类型同时包含动态行和列:
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
但是,已经有typedef
:MatrixXd
。
或者,如果您仍然需要编译时大小,则可以使用tranpose
而不是transposeInPlace
来为您提供新的转置矩阵,而不是修改当前的矩阵:
typedef Eigen::Matrix<double, Eigen::Dynamic, 1> ColumnVector;
ColumnVector column = row.transpose();