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)似乎有效。我确信我已经试过了,奇怪。谢谢你的帮助。