我将Eigen::SparseMatrix
用于线性方程组的大型矩阵,目前我使用setFromTriplets()
对其进行设置。
我的问题是,我无法确定是否有可能以此有效地初始化对称矩阵。现在,我必须保留它的上下部分(在三联列表中,这要糟糕得多,因为不仅有一个值本身,而且也有它的索引)。
最好是该功能可以在遇到时立即复制非对角元素。还是已经有这样的功能?
也许矩阵还有一个对称的属性,所以即使在初始化之后,矩阵也只保留其中一部分,而所有其他算法都将此属性考虑在内?
答案 0 :(得分:2)
如果您的矩阵S
仅设置了三角形的上半部(或下半部),则可以使用
S.selfadjointView<Eigen::Upper>(); // or Eigen::Lower
以获得矩阵的自伴视图。对于实值矩阵,这等效于通过将转置的一半复制到未设置的一半而生成的对称矩阵。
这可用于大多数使用稀疏矩阵的表达式,而无需显式存储矩阵的两半。
最小用法演示:https://godbolt.org/z/6UyDGZ
此外,所有Cholesky-related solvers自然都只考虑输入矩阵的一半。