我很抱歉提出关于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
将在临时内进行评估。