优化特征表达

时间:2019-02-14 07:41:22

标签: c++ eigen

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

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

其中s是标量,C是矩阵(通常为10x10),DU是向量。我尝试过:

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

但是我认为阅读docs还不够。在本征中优化此表达式的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

首先将D-U评估为一个临时向量,使其仅被评估一次,然后,由于您的向量很小,请尝试用*替换.lazyProduct(...)。更准确地说,您将得到:

auto DU = (D-U).eval();
A.noalias() += s * (C + DU.lazyProduct(DU.transpose()));

当然,您必须在启用完整的编译器优化的情况下准确地评估每个更改,以查看它们是否真正有效且不会产生反作用。

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