推荐用于scipy中稀疏正定线性系统的直接求解器?

时间:2013-07-31 05:39:42

标签: scipy sparse-matrix

如果在scipy.sparse文档中清楚地解释了这一点,我很抱歉。

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

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

1 个答案:

答案 0 :(得分:5)

scipy.sparse.linalg.spsolve 很清楚, 但似乎为了速度你必须

pip install scikit-umfpack

或者

  1. 从中构建UMFPACK和AMD SuiteSparse
  2. 然后从源代码重建scipy site.cfg中的[umfpack] umfpack_libs = ...
  3. 否则scipy.sparse.linalg默认为较慢的SuperLU。

      

    是scikit.sparse的方法吗?

    与什么相比,用什么标准? 如果C / C ++足够您,请直接使用SuiteSparse。 任何工具都取决于你喜欢什么, 用户:一,二,多。 也许更好的可视化可以帮助您的项目更快地解决问题。

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

    + python用于快速开发,数据输入 - 矩阵 - 可视化
    +几个包建立在scipy.sparse上; 在你的申请区域询问(这是?)
    - 粗糙的边缘(矩阵是一种痛苦),afaik没有wiki来收集提示和代码片段
    - 图层,scipy.sparse - SuiteSparse - ... BLAS ... 使计时和调试变得艰难。

    Fwiw,我的iMac上的求解时间变化很大。 这些都是默认的args,没有umfpack (这不是一个现实的测试用例;但是 satisficing通常足够好。)

    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