Python中非奇异稀疏矩阵的生成

Python中非奇异稀疏矩阵的生成,python,numpy,matrix,scipy,Python,Numpy,Matrix,Scipy,当由scipy.sparse.rand生成稀疏矩阵时,它可能是奇异的。事实上,下面的代码在文件scipy/sparse/linalg/dsolve/superlu/SRC/dsnode_bmod.c的第100行引发了一个错误“RuntimeError:superlu故障(奇异矩阵?) 有没有办法生成非奇异稀疏矩阵 我真正想做的是比较scipy.sparse.linalg.inv和np.linalg.inv的性能(处理时间)。这就是为什么我需要生成非奇异的随机稀疏矩阵。矩阵的密度比率=0.0001

当由
scipy.sparse.rand
生成稀疏矩阵时,它可能是奇异的。事实上,下面的代码在文件scipy/sparse/linalg/dsolve/superlu/SRC/dsnode_bmod.c的第100行引发了一个错误
“RuntimeError:superlu故障(奇异矩阵?)

有没有办法生成非奇异稀疏矩阵


我真正想做的是比较
scipy.sparse.linalg.inv
np.linalg.inv
的性能(处理时间)。这就是为什么我需要生成非奇异的随机稀疏矩阵。

矩阵的密度
比率=0.000133
非常低。这意味着7518项中大约有一项是非空的。因此,每个项为空的概率约为7517/7518

每行由20000个独立术语组成。因此,一行为空的概率为(7517/7518)^20000=6.99%。因此,行非空的概率为1-(7517/7518)^20000=93.0%

然后,矩阵由20000行组成。行可以被认为是独立的。因此,矩阵不包含空行的概率为(1-(7517/7518)^20000)^20000=(93.0%)^20000。这种可能性很低

由于矩阵可能包含空行,因此它通常是奇异的

[P>此外,由于浮点数的有限精度,程序经常把病态矩阵看作奇异的。事实上,在这种情况下,计算出的逆运算将是非常不精确和毫无意义的


最后,为了比较反函数,最好使用已知可逆的矩阵。。。至少,您可以尝试增加密度,使空行的概率变得非常低。

正如@hpaulj在评论中所建议的,您可以向随机矩阵添加一个单位矩阵,使其可逆

但是,在需要找到线性方程组近似解的应用中,只需将单位矩阵乘以一个小因子:

dim = 20000
ratio = 0.000133
A = csc_matrix(scipy.sparse.random(dim, dim, density=ratio), dtype=float)
A = A + scipy.sparse.csr_matrix(np.eye(A.shape[0]) * 1e-8)
A = scipy.sparse.csc_matrix(A)
inv_sparse = scipy.sparse.linalg.inv(A)

这里的注释可能会帮助你,你也可以检查行列式,然后做倒数。。。或者生成它们并处理异常。。。可能会事先生成已知为非奇异的情况,因为两行或更多行或列都是零,所以它是单数吗?如果密度足够低,这是可能的。请尝试向其添加
sparse.eye(A.shape[0])
dim = 20000
ratio = 0.000133
A = csc_matrix(scipy.sparse.random(dim, dim, density=ratio), dtype=float)
A = A + scipy.sparse.csr_matrix(np.eye(A.shape[0]) * 1e-8)
A = scipy.sparse.csc_matrix(A)
inv_sparse = scipy.sparse.linalg.inv(A)