optimization - 特征是否具有自转置乘法优化,如 H.transpose()*H

标签 optimization eigen matrix-multiplication neon

我已经浏览了 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/

相关文章:

android cursor movetofirst 性能问题

matlab - 矩形嵌套 - 使用模拟退火收敛到最优解

c# - 优化代码: Linq and foreach loop 15k records

python - 如何矢量化此 python 代码以使其更高效? (速度)

c++ - 这个矩阵博览会代码是对数的吗?

mysql - 有没有办法找到Excel中最大的小数位数

c++ - 为什么我的程序在使用 makefile 编译时变慢了?

c++ - Catkin构建中的错误找不到软件包 “numpy_eigen”

c++ - 5 对角矩阵和 for 循环

python - 乘以关于列名的不同长度的数据帧