C++ 优化特征表达式

C++ 优化特征表达式,c++,eigen,C++,Eigen,我正在尝试优化此乘法的代码: A += s * (C + (D-U) * (D-U).transpose()); 其中,s是标量,C是矩阵(通常为10x10),D和U是向量。我试过: A.noalias() += s * (C + (D-U) * (D-U).transpose()); 但我认为这还不够。在eigen中优化此表达式的最佳方法是什么?首先将D-U计算为一个临时向量,以便只计算一次,然后,由于向量很小,请尝试将*替换为.lazydroduct(…)。更准确地说,你最终会得到: a

我正在尝试优化此乘法的代码:

A += s * (C + (D-U) * (D-U).transpose());
其中,
s
是标量,
C
是矩阵(通常为10x10),
D
U
是向量。我试过:

A.noalias() += s * (C + (D-U) * (D-U).transpose());

但我认为这还不够。在eigen中优化此表达式的最佳方法是什么?

首先将
D-U
计算为一个临时向量,以便只计算一次,然后,由于向量很小,请尝试将
*
替换为
.lazydroduct(…)
。更准确地说,你最终会得到:

auto DU = (D-U).eval();
A.noalias() += s * (C + DU.lazyProduct(DU.transpose()));
当然,您必须准确地测试每个更改,并对其进行完整的编译器优化,以查看它们是否真的有效,而不是适得其反


最后,如果
A
C
是对称的,您可能会尝试只更新A的一半。这对于大型矩阵(例如>200x200)是有意义的,但是,由于矩阵非常小,这将适得其反,因为逻辑开销和SIMD效率较低。

首先将
D-U
计算为一个临时向量,以便只计算一次,然后,由于向量很小,请尝试将
*
替换为
。lazyProduct(…)
,更重要的是,在@ggael上进行完整的编译器优化,以准确地测试您的更改。这应该是答案-您在注释中写道:是
a
C
自伴?它们是协方差矩阵