在多个相同矩阵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;
(它说“写入特定的三角形部分:(仅评估引用的三角形部分)”)。否则,在你写的那一行
Eigen会计算整个稀疏矩阵matA.transpose()*matA
.
关于保存结果 m1
矩阵,它与保存任何类型的矩阵相同( Eigen::MatrixXt
或 Eigen::SparseMatrix<t>
)。如果m1
是稀疏的,那么它将只有一个简单 matA.transpose()*matA
大小的一半.如果m1
是稠密的,则为满方阵。
关于c++ - Eigen 库中的稀疏稀疏积 A^T*A 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30784501/