在Eigen中从矩阵中提取矢量的正确方法是什么?

时间:2016-08-03 09:48:59

标签: c++ matrix eigen

我是Eigen的初学者,我正在做的是从矩阵中提取不同的行并进行一些计算。

代码看起来像这样

MatrixXd mat(5, 10);
VectorXd vec1 = mat.row(1);
VectorXd vec2 = mat.row(2);
// do some calculation with vec1 and vec2

所以问题是,通过像VectorXd vec = mat.row(1)这样的内存分配/内存复制可能对性能有害。由于我只使用它进行计算,并且肯定不会对下面的矩阵做任何更改,有更好的方法吗?

我尝试使用Eigen::Block,但似乎Block不支持某些矩阵操作(我不确定)。

1 个答案:

答案 0 :(得分:2)

.row()本身对于表现来说并不坏,它是Eigen的块表达式之一。

  

块表达式既可以用作rvalues,也可以用作lvalues。如   通常使用Eigen表达式,这种抽象的运行时成本为零   只要您让编译器优化。

如果根据表达式制定计算,编译器可以进行所有类型的优化。

以下是一些例子:

mat.row(2) = 2 * mat.row(0) + mat.row(1);
float x = (mat.row(0) - mat.row(1)).squaredNorm();

通过这种方式,您可以在编译时提供Eigen可以优化的足够信息。

不确定您对Eigen::Block的意思,最常见的用法应该是矩阵的.block()https://eigen.tuxfamily.org/dox/group__TutorialBlockOperations.html