本征是否有像 H.transpose()*H 这样的自转置乘法优化
does eigen have self transpose multiply optimization like H.transpose()*H
我浏览了 eigen 的教程
https://eigen.tuxfamily.org/dox-devel/group__TutorialMatrixArithmetic.html
它说
"Note: for BLAS users worried about performance, expressions such as c.noalias() -= 2 * a.adjoint() * b; are fully optimized and trigger a single gemm-like function call."
但是像 H.transpose() * H 这样的计算怎么样,因为它的结果是一个对称矩阵,所以它应该只需要正常 A*B 的一半时间,但在我的测试中,H.transpose () * H spend as same time as 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。
我浏览了 eigen 的教程 https://eigen.tuxfamily.org/dox-devel/group__TutorialMatrixArithmetic.html
它说 "Note: for BLAS users worried about performance, expressions such as c.noalias() -= 2 * a.adjoint() * b; are fully optimized and trigger a single gemm-like function call."
但是像 H.transpose() * H 这样的计算怎么样,因为它的结果是一个对称矩阵,所以它应该只需要正常 A*B 的一半时间,但在我的测试中,H.transpose () * H spend as same time as 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。