我是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
不支持某些矩阵操作(我不确定)。
答案 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