本征 matmul 运行时间取决于乘法顺序

Eigen matmul runtime depending on order of multiplication

我遇到的问题是,涉及某些矩阵乘法的函数的运行时间会根据乘法的顺序和中间保存的值而变化。这些是变量...

Eigen::SparseMatrix<double> C; \ = a sparse matrix (NxM)
Eigen::MatrixXd M_inv; \ = a dense matrix (NxN)
Eigen::VectorXd v; \ = a dense vector (dim M)

并且 N << M。这很快,

Eigen::VectorXd alpha = M_inv * C * v;
Eigen::VectorXd v_n = v - C.transpose() * alpha;

而且这些很慢(不要完成),

Eigen::MatrixXd D = C.transpose() * M_inv * C;
Eigen::VectorXd v_n = v - D * v;
Eigen::VectorXd v_n = v - C.transpose() * M_inv * C * v;

这是否与内存使用或稀疏和密集 matmul 相关?

编辑:N 为 10 阶,M 为 10^6 阶

(matrix * matrix) * vector 产品的评估几乎肯定会比 matrix * (matrix * vector) 慢。即使在您的快速版本中,您也应该确保从右到左评估产品:

Eigen::VectorXd alpha = M_inv * (C * v);
Eigen::VectorXd v_n = v - C.transpose() * alpha;

如果以后不需要alpha,也可以写成一行:

Eigen::VectorXd v_n = v - C.transpose() * (M_inv * (C * v));