稀疏对称矩阵初始化

时间:2019-11-08 20:32:19

标签: c++ eigen

我将Eigen::SparseMatrix用于线性方程组的大型矩阵,目前我使用setFromTriplets()对其进行设置。

我的问题是,我无法确定是否有可能以此有效地初始化对称矩阵。现在,我必须保留它的上下部分(在三联列表中,这要糟糕得多,因为不仅有一个值本身,而且也有它的索引)。

最好是该功能可以在遇到时立即复制非对角元素。还是已经有这样的功能?

也许矩阵还有一个对称的属性,所以即使在初始化之后,矩阵也只保留其中一部分,而所有其他算法都将此属性考虑在内?

1 个答案:

答案 0 :(得分:2)

如果您的矩阵S仅设置了三角形的上半部(或下半部),则可以使用

S.selfadjointView<Eigen::Upper>();  // or Eigen::Lower

以获得矩阵的自伴视图。对于实值矩阵,这等效于通过将转置的一半复制到未设置的一半而生成的对称矩阵。

这可用于大多数使用稀疏矩阵的表达式,而无需显式存储矩阵的两半。

最小用法演示:https://godbolt.org/z/6UyDGZ

此外,所有Cholesky-related solvers自然都只考虑输入矩阵的一半。