【问题标题】:Why is 'scipy.sparse.linalg.spilu' less efficient than 'scipy.linalg.lu' for sparse matrix?为什么稀疏矩阵的“scipy.sparse.linalg.spilu”效率低于“scipy.linalg.lu”?
【发布时间】:2020-06-01 16:11:52
【问题描述】:

我在https://scicomp.stackexchange.com 上发布了这个question,但没有受到关注。只要我在其中一个中得到答案,我就会在另一个中通知。


我有一个稀疏矩阵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

【问题讨论】:

  • 创建稀疏矩阵也需要时间。
  • @hpaulj 但我也计算了矩阵分解过程的时间。

标签: python numpy matrix scipy sparse-matrix


【解决方案1】:
(B==0).sum()
Out[5]: 49510694

B.shape
Out[6]: (10000, 10000)

(B==0).sum()/100000000
Out[7]: 0.49510694

您的矩阵 B 一点也不稀疏。 B 中超过一半的元素是非零的。当然 spilu 在处理如此密集的矩阵时效率会降低。

【讨论】:

  • 我想问一下是否有任何用于矩阵的指定求解器,其中许多行具有前导零,即许多行已经是上三角形式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2021-11-25
  • 2017-07-02
相关资源
最近更新 更多