Optimization eigen是否有像H.transpose()*H一样的自转置乘法优化

Optimization eigen是否有像H.transpose()*H一样的自转置乘法优化,optimization,eigen,matrix-multiplication,neon,Optimization,Eigen,Matrix Multiplication,Neon,我已经在浏览了eigen的教程 上面说 “注意:对于担心性能的BLAS用户,c.noalias()-=2*a.Adjunct()*b;等表达式经过充分优化,并触发单个类似gemm的函数调用。” 但是像H.transpose()*H这样的计算呢,因为它的结果是一个对称矩阵,所以它应该只需要普通a*B的一半时间,但在我的测试中,H.transpose()*H与H.transpose()*B花费相同的时间。eigen是否对这种情况有特殊的优化,像opencv一样,它有类似的功能 我知道对称优化会破坏

我已经在浏览了eigen的教程

上面说 “注意:对于担心性能的BLAS用户,c.noalias()-=2*a.Adjunct()*b;等表达式经过充分优化,并触发单个类似gemm的函数调用。”

但是像H.transpose()*H这样的计算呢,因为它的结果是一个对称矩阵,所以它应该只需要普通a*B的一半时间,但在我的测试中,H.transpose()*H与H.transpose()*B花费相同的时间。eigen是否对这种情况有特殊的优化,像opencv一样,它有类似的功能


我知道对称优化会破坏矢量化,我只想知道eigen是否有解决方案可以同时提供对称优化和矢量化

你是对的,你需要告诉eigen结果是对称的:

Eigen::MatrixXd H=Eigen::MatrixXd::Random(m,n);
本征::矩阵xxd Z=本征::矩阵xxd::零(n,n);
Z.template selfadjointView().rankUpdate(H.transpose());
最后一行计算下三角部分内的
Z+=H*H^T
。上半部分保持不变。您需要完整的矩阵,然后将下半部分复制到上半部分:

Z.template triangularView()=Z.transpose();
rankUpdate
例程完全矢量化,可与BLAS等效程序进行比较。对于小矩阵,最好执行完整乘积


另请参见相应的。

这绝对是我想要的,我已经对其进行了正确的测试,但在我的测试中,我认为Z.sefladjointView().rankUpdate(H);意思是Z+=H*H'我说得对吗?对,如果你想要H'*H,那么调用
.rankUpdate(H.adjunct())
。抱歉再次打扰您:)我遇到了一个问题,计算HAH',哪个a=a',那么有什么方法可以加速它吗?您可以像往常一样计算
B=H*a
,然后
Z.triangularView()=B*H'
。这将只计算第二个乘积的一半。