特征:使用selfAdjointView仅计算和增加上半部分?

时间:2016-07-16 15:35:05

标签: optimization eigen

我做这样的事情得到:

-f Makefile

这使bMRes += MatrixXd(n, n).setZero() .selfadjointView<Eigen::Upper>().rankUpdate(bM); 增加了bMRes,但速度提高了一倍。 请注意,bM * bM.transpose()bMRes的类型为bM

为了进一步优化,我想跳过下半部分的复制(和增量)。 换句话说,我想计算并只写上部。 换句话说,我希望我的结果在上部,0在下部。

如果不够清楚,请随时提问。

提前致谢。

弗洛里安

1 个答案:

答案 0 :(得分:2)

如果您的bMRes最初是自我约会,则可以使用以下代码,该代码仅更新bMRes的上半部分。

bMRes.selfadjointView<Eigen::Upper>().rankUpdate(bM);

如果没有,我认为您必须接受.selfadjointView<>()在分配到MatrixXd时将始终复制另一半。

A*A.transpose().rankUpdate(A)相比,当A相当大时,可以忽略复制A一半的费用。所以我想你不需要进一步优化你的代码。

如果您只想评估差异,可以使用低级BLAS API。 A*A.transpose()相当于gemm(),而.rankUpdate(A)相当于syrk(),但syrk()不会自动复制另一半。