分解 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
无论如何都会在临时文件中求值。
很抱歉提出有关 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
无论如何都会在临时文件中求值。