很抱歉提出关于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可以完成任务,但是会变慢,因为出于效率原因,无论如何,都会在一个临时值中评估子表达式I+M

10-07 22:07