Eigen 库中的稀疏稀疏积 A^T*A 优化

sparse sparse product A^T*A optim in Eigen lib

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

matA.transpose()*matA, 

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

因此,仅用于计算就足够了。前任。下三角部分和其余部分仅复制.......因为多个第 2 行和第 3 行的结果 resp.col 与第 3 行和第 2 行相同......等等......

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

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

根据 documentation,您可以计算矩阵的下三角:

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

或者您的情况:

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

(其中显示 "Writing to a specific triangular part: (only the referenced triangular part is evaluated)")。否则,在你写的那一行 Eigen会计算整个稀疏矩阵matA.transpose()*matA

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

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());