分解 Eigen3 临时变量以提高计算速度

factoring Eigen3 temporaries to improve computation speed

很抱歉提出有关 Eigen3 优化计算方案的一般性问题。假设我们确实拥有两个 Eigen3 矩阵,M 和 N。假设我们需要计算以下内容:

Eigen::Matrix<double, 3,3> M;
Eigen::Matrix<double, 3,3> N;

// here is the computation:
Eigen::Matrix<double, 3,3> D = Eigen::Matrix<double, 3,3>::Identity() + M;
Eigen::Matrix<double, 3,3> R = D * N * D.transpose();

我想知道的是:有没有办法避免将表达式 I + M 复制到完整矩阵(因此是副本),而是在这样的表达式中使用惰性求值方案。希望用 C++11 编写这样的东西是可行的:

auto D = Eigen::Matrix<double, 3,3>::Identity() + M;
Eigen::Matrix<double, 3,3> R = D * N * D.transpose();

通常情况下,D 在这种情况下是一个复合(可能很复杂)模板惰性求值。类型,所以这通常应该可以解决问题。如果不是这样,你能纠正我吗?

按照同样的想法,我想做同样的事情:

auto E = <undisclosed_type coma initializer>(
                M,
                Eigen::Matrix<double, 3,3>::Zero());
Eigen::Matrix<double, 6,6> R = E * N * E.transpose();

但我不知道如何执行这样的优化。所以,如果有一种方法可以在评估过程中根据指令数量对其进行优化,这可能会对我有所帮助。

在此先感谢您的帮助。

目前对于逗号初始值设定项这件事是不可能的,尽管有一个建议:bug 716。然而,即使有了这样一个使逗号初始值设定项成为真实表达式的补丁,我们仍需要更多代码才能使您的示例高效。同时,最好自己写:

R.topLeftCorner<3,3>() = M * N * M.transpose();

关于第一个示例,使用 auto 可以完成工作,但速度会较慢,因为出于效率原因,sub-expression I+M 无论如何都会在临时文件中求值。