我做这样的事情得到:
-f Makefile
这使bMRes += MatrixXd(n, n).setZero()
.selfadjointView<Eigen::Upper>().rankUpdate(bM);
增加了bMRes
,但速度提高了一倍。
请注意,bM * bM.transpose()
和bMRes
的类型为bM
。
为了进一步优化,我想跳过下半部分的复制(和增量)。 换句话说,我想计算并只写上部。 换句话说,我希望我的结果在上部,0在下部。
如果不够清楚,请随时提问。
提前致谢。
弗洛里安
答案 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()
不会自动复制另一半。