5

如果在 scipy.sparse 文档中对此进行了清楚的解释,我很抱歉。

使用 scipy 时,您建议使用什么函数来求解稀疏的正定线性方程组?我想使用直接方法,并且我希望对列进行重新排序,以便在系数矩阵的 Cholesky 分解中尽可能地保持稀疏性。理想情况下,我可以尝试各种重新排序选项。

scipy.sparse 中是否存在稀疏正定系统的直接求解器?scikit.sparse 是要走的路吗?

4

1 回答 1

6

scipy.sparse.linalg.spsolve 已经足够清楚了,但似乎为了速度你必须

pip install scikit-umfpack

要不然

  1. 从SuiteSparse构建 UMFPACK 和 AMD
  2. 然后在 site.cfg 中从源代码重建 [umfpack] umfpack_libs = ...scipy。

否则 scipy.sparse.linalg 默认为较慢的 SuperLU。

scikit.sparse 是要走的路吗?

比较什么,用什么标准?如果 C/C++ 对你来说足够了,直接使用 SuiteSparse。任何工具都取决于您喜欢什么,以及用户:一个、两个、多个。也许更好的可视化比更快的 spsolve 更能帮助您的项目。

scipy.sparse 的一些非常明显的优点和缺点:

+ python 用于快速开发,数据输入——矩阵——可视化
+ 几个包已经建立在 scipy.sparse 上;在您的应用程序区域中询问(这是?)
- 粗糙的边缘(矩阵很痛苦),afaik 没有 wiki 来收集提示和代码片段
- 层层叠加,scipy.sparse -- SuiteSparse -- ... BLAS .. . 使计时和调试变得困难。

Fwiw,求解器时间在我的 iMac 上变化很大。这些都带有默认参数,没有 umfpack。
(这不是一个现实的测试用例;但 满足通常就足够了。)

X = sparse.rand( m, n, dens, format="csr" )
A = 1e-6 * sparse.eye(m) + X * X.T
linalg solvers( A, b )

(5000, 5000)  density 0.42 % --
   51 msec spsolve
    5 msec bicg
    3 msec bicgstab
    2 msec cg
    4 msec cgs
    3 msec gmres
    4 msec lgmres
    1 msec minres
    6 msec qmr
    5 msec lsmr
(5000, 5000)  density 0.84 % --
  428 msec spsolve
   12 msec bicg
    7 msec bicgstab
    5 msec cg
   10 msec cgs
    6 msec gmres
    8 msec lgmres
    2 msec minres
   13 msec qmr
   12 msec lsmr
(5000, 5000)  density 1.3 % --
 1462 msec spsolve
   16 msec bicg
    9 msec bicgstab
    7 msec cg
   11 msec cgs
    7 msec gmres
   10 msec lgmres
    1 msec minres
   18 msec qmr
   14 msec lsmr
于 2013-08-15T17:37:41.983 回答