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

问题描述 投票:2回答:1

我很抱歉提出关于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();

但我不知道如何进行这样的优化。因此,如果有一种方法可以在评估过程中根据指令编号对其进行优化,这可以帮助我。

在此先感谢您的帮助。

c++11 optimization lazy-evaluation eigen eigen3
1个回答
1
投票

目前这对于逗号初始化程序来说是不可能的,尽管有一个建议:bug 716。但是,即使使用这样的补丁使逗号初始化器成为真正的表达式,我们也需要更多代码才能使您的示例更有效。同时,通过写作更好地完成工作:

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

关于第一个例子,使用auto将完成这项工作,但它会更慢,因为出于效率原因,子表达式I+M将在临时内进行评估。

© www.soinside.com 2019 - 2024. All rights reserved.