我已经浏览了 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();
此
rankUpdate
例程是完全矢量化的,可与 BLAS 等效项进行比较。对于小矩阵,更好地执行完整的产品。另请参阅相应的 doc .
关于optimization - 特征是否具有自转置乘法优化,如 H.transpose()*H,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39606224/