稀疏稀疏积A ^ T * Eigen lib中的一个优化

时间:2015-06-11 15:02:36

标签: c++ matrix-multiplication eigen3

在多个相同矩阵matA的情况下,如

matA.transpose()*matA, 

您不必计算所有结果产品,因为结果矩阵是对称的(因此只有m> n时),在我的特定情况下始终是对称的!方。

所以它的计算仅限于。恩。下三角部分和休息只复制.....因为多个第二和第三行的结果,resp.col,是相同的第三和第二.....等等....

所以我的问题是,存在如何告诉Eigen的方式,只计算下半部分。并且可选择只保存产品中较低的trinaguler部分?

    DATA = SparseMatrix<double>((SparseMatrix<double>(matA.transpose()) * matA).pruned()).toDense();

2 个答案:

答案 0 :(得分:1)

根据documentation,您可以使用以下符号评估矩阵的下三角形:

m1.triangularView<Eigen::Lower>() = m2 + m3;

或在你的情况下:

m1.triangularView<Eigen::Lower>() = matA.transpose()*matA;

(其中&#34;写入特定的三角形部分:(仅评估参考的三角形部分)&#34;)。否则,在你写的那一行 Eigen将计算整个稀疏矩阵matA.transpose()*matA

关于保存生成的m1矩阵,它与保存任何类型的矩阵(Eigen::MatrixXtEigen::SparseMatrix<t>)相同。如果m1稀疏,那么它只是简单matA.transpose()*matA的一半大小。如果m1密集,则它将是完整的方阵。

答案 1 :(得分:1)

https://eigen.tuxfamily.org/dox/classEigen_1_1SparseSelfAdjointView.html

对称等级更新定义为:

B = B + alpha * A * A^T

其中alpha是标量。在您的情况下,您正在做A ^ T * A,因此您应该改为传递转置矩阵。生成的矩阵将仅存储矩阵的上部或下部,无论您选择哪个。例如:

SparseMatrix<double> B;
B.selfadjointView<Lower>().rankUpdate(A.transpose());