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