在多个相同矩阵matA的情况下,如
matA.transpose()*matA,
您不必计算所有结果产品,因为结果矩阵是对称的(因此只有m> n时),在我的特定情况下始终是对称的!方。
所以它的计算仅限于。恩。下三角部分和休息只复制.....因为多个第二和第三行的结果,resp.col,是相同的第三和第二.....等等....
所以我的问题是,存在如何告诉Eigen的方式,只计算下半部分。并且可选择只保存产品中较低的trinaguler部分?
DATA = SparseMatrix<double>((SparseMatrix<double>(matA.transpose()) * matA).pruned()).toDense();
答案 0 :(得分:1)
根据documentation,您可以使用以下符号评估矩阵的下三角形:
m1.triangularView<Eigen::Lower>() = m2 + m3;
或在你的情况下:
m1.triangularView<Eigen::Lower>() = matA.transpose()*matA;
(其中&#34;写入特定的三角形部分:(仅评估参考的三角形部分)&#34;)。否则,在你写的那一行
Eigen将计算整个稀疏矩阵matA.transpose()*matA
。
关于保存生成的m1
矩阵,它与保存任何类型的矩阵(Eigen::MatrixXt
或Eigen::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());