我浏览过 eigen 的教程https://eigen.tuxfamily.org/dox-devel/group__TutorialMatrixArithmetic.html
它说
“注意:对于担心性能的 BLAS 用户,c.noalias() -= 2 * a.adjoint() * 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);
Eigen::MatrixXd Z = Eigen::MatrixXd::Zero(n,n);
Z.template selfadjointView<Eigen::Lower>().rankUpdate(H.transpose());
最后一行计算Z += H * H^T
位于下三角部分内。上部保持不变。您想要一个完整的矩阵,然后将下半部分复制到上半部分:
Z.template triangularView<Eigen::Upper>() = Z.transpose();
This rankUpdate
例程是完全矢量化的并且与 BLAS 等效项相当。对于小矩阵,更好地执行完整的乘积。
另请参阅相应的doc.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)