为什么 'scipy.sparse.linalg.spilu' 对于稀疏矩阵的效率低于 'scipy.linalg.lu'?

Why is 'scipy.sparse.linalg.spilu' less efficient than 'scipy.linalg.lu' for sparse matrix?

我发布了这个 question on 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在处理如此密集的矩阵时效率会低一些。