Optimization 特征值:仅对具有自伴视图的上部进行计算和增量?
我这样做是为了:Optimization 特征值:仅对具有自伴视图的上部进行计算和增量?,optimization,eigen,Optimization,Eigen,我这样做是为了: bMRes += MatrixXd(n, n).setZero() .selfadjointView<Eigen::Upper>().rankUpdate(bM); bMRes+=MatrixXd(n,n).setZero() .selfadjointView().rankUpdate(bM); 这使我得到了bMRes的增量,增量是bM*bM.transpose()的两倍。 请注意,bMRes和bM属于Map类型 为了进一步优化,我想跳过下半部分的复制(和增量)
bMRes += MatrixXd(n, n).setZero()
.selfadjointView<Eigen::Upper>().rankUpdate(bM);
bMRes+=MatrixXd(n,n).setZero()
.selfadjointView().rankUpdate(bM);
这使我得到了bMRes
的增量,增量是bM*bM.transpose()
的两倍。
请注意,bMRes
和bM
属于Map
类型
为了进一步优化,我想跳过下半部分的复制(和增量)。
换句话说,我只想计算和写上面的部分。
同样,换句话说,我希望我的结果在上半部分,0在下半部分
如果不够清楚,请随时提问
提前谢谢
Florian如果您的
bMRes
最初是自伴的,您可以使用以下代码,它只更新bMRes
的上半部分
bMRes.selfadjointView<Eigen::Upper>().rankUpdate(bM);
bMRes.selfadjointView().rankUpdate(bM);
如果没有,我认为您必须接受。selfadjointView()
在分配给矩阵xd
时,将始终复制另一半
与A*A.transpose()
或.rankUpdate(A)
相比,当A
相当大时,复制A
一半的成本可以忽略。所以我想您不需要进一步优化代码
如果您只想评估差异,可以使用低级BLASAPI
A*A.transpose()
相当于,并且.rankUpdate(A)
相当于,但是syrk()
不会自动复制另一半。如果你的bMRes
最初是自伴的,你可以使用下面的代码,它只更新bMRes
的上半部分
bMRes.selfadjointView<Eigen::Upper>().rankUpdate(bM);
bMRes.selfadjointView().rankUpdate(bM);
如果没有,我认为您必须接受。selfadjointView()
在分配给矩阵xd
时,将始终复制另一半
与A*A.transpose()
或.rankUpdate(A)
相比,当A
相当大时,复制A
一半的成本可以忽略。所以我想您不需要进一步优化代码
如果您只想评估差异,可以使用低级BLASAPI
A*A.transpose()
相当于,而且rankUpdate(A)
相当于,但是syrk()
不会自动复制另一半。比什么快一倍?直接计算bM*bM.transpose()
因为它知道结果是对称矩阵,然后只复制下半部分。速度是什么的两倍?直接计算bM*bM.transpose()
因为它知道结果是对称矩阵,然后只复制下半部分。您好@kangshiyin,谢谢您的回复。首先,MatrixXd::Zero(n,n)不适合我。其次,我有一个错误:错误:“类特征::SelfAdjointView”没有名为“triangularView”的成员@F.Privé我更改了我的答案。bMRes.SelfAdjointView().rankUpdate(bM)代码>似乎有效。我确信我已经试过了,奇怪。谢谢你的帮助。你好@kangshiyin,谢谢你的回复。首先,MatrixXd::Zero(n,n)不适合我。其次,我有一个错误:错误:“类特征::SelfAdjointView”没有名为“triangularView”的成员@F.Privé我更改了我的答案。bMRes.SelfAdjointView().rankUpdate(bM)代码>似乎有效。我确信我已经试过了,奇怪。谢谢你的帮助。