gpt4 book ai didi

c++11 - 因式分解 Eigen3 临时值以提高计算速度

转载 作者:行者123 更新时间:2023-12-02 07:59:26 26 4
gpt4 key购买 nike

我很抱歉提出一个关于 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 将在无论如何都是暂时的。

关于c++11 - 因式分解 Eigen3 临时值以提高计算速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48994261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com