我正在尝试优化此乘法的代码:
A += s * (C + (D-U) * (D-U).transpose());
其中s
是标量,C
是矩阵(通常为10x10),D
和U
是向量。我尝试过:
A.noalias() += s * (C + (D-U) * (D-U).transpose());
但是我认为阅读docs还不够。在本征中优化此表达式的最佳方法是什么?
答案 0 :(得分:3)
首先将D-U
评估为一个临时向量,使其仅被评估一次,然后,由于您的向量很小,请尝试用*
替换.lazyProduct(...)
。更准确地说,您将得到:
auto DU = (D-U).eval();
A.noalias() += s * (C + DU.lazyProduct(DU.transpose()));
当然,您必须在启用完整的编译器优化的情况下准确地评估每个更改,以查看它们是否真正有效且不会产生反作用。
最后,如果A
和C
是对称的,您可能会倾向于只更新A的一半。这对于大型矩阵(例如,> 200x200)是有意义的,但是由于您的矩阵是很小,由于逻辑开销和SIMD效率较低,这会适得其反。