C++11 分解特征值3个临时值以提高计算速度

C++11 分解特征值3个临时值以提高计算速度,c++11,optimization,lazy-evaluation,eigen,eigen3,C++11,Optimization,Lazy Evaluation,Eigen,Eigen3,我很抱歉提出一个关于优化计算的特征3’方案的一般性问题。假设我们有两个特征3矩阵,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; Eig

我很抱歉提出一个关于优化计算的特征3’方案的一般性问题。假设我们有两个特征3矩阵,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();
Eigen::矩阵M;
本征矩阵N;
//计算如下:
特征::矩阵D=特征::矩阵::恒等式()+M;
特征::矩阵R=D*N*D.转置();
我想知道的是:有没有办法避免将表达式I+M复制到一个完整的矩阵中(因此是一个副本),而是在这样一个表达式中使用惰性求值方案。希望用C++11编写类似这样的代码是可行的:

auto D = Eigen::Matrix<double, 3,3>::Identity() + M;
Eigen::Matrix<double, 3,3> R = D * N * D.transpose();
auto D=Eigen::Matrix::Identity()+M;
特征::矩阵R=D*N*D.转置();
通常情况下,D在本例中是一个复合(可能很复杂)模板lazy eval。类型,所以这通常可以解决问题。如果不是,你能纠正我吗

按照相同的想法顺序,我想对以下方面做同样的事情:

auto E = <undisclosed_type coma initializer>(
                M,
                Eigen::Matrix<double, 3,3>::Zero());
Eigen::Matrix<double, 6,6> R = E * N * E.transpose();
auto E=(
M
特征::矩阵::零();
本征::矩阵R=E*N*E.转置();
但我不知道如何执行这样的优化。因此,如果有一种方法可以在评估过程中根据指令数优化这一点,这将对我有所帮助


提前感谢您的帮助。

这对于逗号初始值设定项是不可能的,尽管有一个建议:。然而,即使有这样一个补丁使逗号初始值设定项成为一个真正的表达式,我们也需要更多的代码来提高示例的效率。同时,最好自己写下:

R.topLeftCorner<3,3>() = M * N * M.transpose();
R.topLeftCorner()=M*N*M.transpose();
关于第一个示例,使用
auto
可以完成这项工作,但速度会慢一些,因为出于效率原因,子表达式
I+M
将在临时时间内进行计算