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::MatrixXt
或 Eigen::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());
在多个相同矩阵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::MatrixXt
或 Eigen::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());