我试图反转一个大的require
稀疏矩阵,如下所示:
(150000,150000)
导致以下错误消息:
import scipy as sp
import scipy.sparse.linalg as splu
#Bs is a large sparse matrix with shape=(150000,150000)
#calculating the sparse inverse
iBs=splu.inv(Bs)
我重新编写程序以简单地求解线性微分方程组:
Traceback (most recent call last):
iBs=splu.inv(Bs)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 134, in spsolve
autoTranspose=True)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 603, in linsolve
self.numeric(mtx)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 450, in numeric
umfStatus[status]))
RuntimeError: <function umfpack_di_numeric at 0x7f2c76b1d320> failed with UMFPACK_ERROR_out_of_memory
我再次遇到同样的错误
我在具有16 GB RAM的计算机上使用此代码,然后将其移动到具有32 GB RAM的服务器上,但仍无济于事。
有没有人遇到过这个?
答案 0 :(得分:2)
首先让我说,http://scicomp.stackexchange.com应该更好地问这个问题,那里有一个很好的计算科学和数值线性代数专家社区。 p>
让我们从基础开始:从不反转稀疏矩阵,它完全没有意义。请参阅MATLAB中心的discussion,特别是Tim Davis的comment。
简要说明:没有用于数字反转矩阵的算法。每当您尝试以数字方式计算NxN矩阵的逆矩阵时,实际上就可以求解N个线性系统,其中N rhs向量对应于单位矩阵的列。
换句话说,当你计算
from scipy.sparse import eye
from scipy.sparse.linalg import (inv, spsolve)
N = Bs.shape[0]
iBs = inv(Bs)
iBs = spsolve(Bs, eye(N))
最后两个语句(inv(eye)
和spsolve(Bs, eye(N))
)是等效的。请注意,身份矩阵(eye(N)
)不是一个向量(np.ones(N)
),因为您提出错误假设。
这里的要点是矩阵求逆在数值线性代数中很少有用:Ax = b的解不是作为inv(A)* b计算的,而是通过专门算法计算的。
针对您的具体问题,对于大型稀疏方程组,没有黑盒求解器。只有在充分了解矩阵问题的结构和属性时,才能选择正确的求解器类。反过来,你的矩阵的属性是你试图解决的问题的结果。例如。当你通过FEM对椭圆偏微分方程组进行离散时,最终会得到一个对称正稀疏的代数方程组。一旦了解了问题的属性,就可以选择正确的求解策略。
在您的情况下,您尝试使用通用直接求解器,而无需重新排序方程式。众所周知,这将产生填充,在iBs
函数的第一阶段(应该是因子分解)中破坏spsolve
矩阵的稀疏性。请注意完全双精度150000 x 150000矩阵需要大约167 GB的内存。有很多技术可以重新排序方程式,以减少因子分解过程中的填充,但是你没有提供足够的信息来为你提供合理的提示。
对不起,你应该考虑在http://scicomp.stackexchange.com上重新阐述你的问题,明确说明你要解决的问题是什么,以便给出矩阵结构和属性的线索。
答案 1 :(得分:0)
稀疏数组只能将矩阵的非零条目拟合到内存中。现在假设你进行了反演。这意味着矩阵的几乎所有条目都变为非零。稀疏矩阵是内存优化的。
有一些操作可以应用于稀疏矩阵而不会丢失&#34;备用&#34;属性: