我将此question发布到了https://scicomp.stackexchange.com,但没有引起注意。只要我在其中一个答案中得到回答,我就会在另一个中告知。
我有一个稀疏的矩阵B
,并尝试利用专门用于稀疏矩阵的函数scipy.sparse.linalg.spilu
分解B
。您能否解释一下为什么此函数比通用矩阵的函数scipy.linalg.lu
效率低得多?非常感谢!
import numpy as np
import scipy.linalg as la
import scipy.sparse.linalg as spla
import time
from scipy import sparse
from scipy.sparse import csc_matrix
A = np.random.randint(100, size=(10000, 10000))
B = np.triu(A, -100)
start = time.time()
(P, L, U) = la.lu(B)
end = time.time()
print('Time to decompose B with lu =', end - start)
start = time.time()
mtx = spla.spilu(csc_matrix(B))
end = time.time()
print('Time to decompose B with spilu =', end - start)
计算时间为
Time to decompose B with lu = 4.7765138149261475
Time to decompose B with spilu = 14.165712594985962
(B==0).sum()
Out[5]: 49510694
B.shape
Out[6]: (10000, 10000)
(B==0).sum()/100000000
Out[7]: 0.49510694
您的矩阵B根本不稀疏。 B中超过一半的元素为非零。当然,在处理这种密集矩阵时,spilu的效率会降低。