【问题标题】:How to tell if a sparse matrix can't be solved如何判断稀疏矩阵是否无法求解
【发布时间】:2014-04-21 20:47:26
【问题描述】:

我正在使用 scipy 的 spsolve 在 Python 中编写一个程序,以使用稀疏矩阵 (csr_matrix) 求解线性方程。矩阵相当大(M=90826x90826,b=90826x1),很难手动检查。

我遇到的问题是,对于我正在创建的一小部分矩阵,scipy.sparse.linalg.spsolve(M,b) 经历了如此灾难性的失败,以至于整个程序崩溃。即使将行包装在 try/except 中,并将程序本身包装在另一个 try/except 中,也无济于事。我什至没有在异常字段中得到响应。

我手动验证了我发送的数据与我想要的不正确,但我无法在其他任何地方进行检查。我的程序涉及到人脸检测,问题可能是检测不好引起的。在这种情况下,“脸”被发现在实际脸的脸颊上。但是,在继续之前手动验证检测是否正确并不是一个真正的选择(最终产品将由非技术客户使用)。而自动验证不在项目范围内。

无论如何,如果我能检测到矩阵会导致 spsolve 崩溃,那么只需跳过图像就可以了。但我似乎找不到关于如何防止 spsolve 崩溃的文献。

我发送的值是 float64 类型,可以是正数或负数。从我所看到的可以求解的矩阵来看,M 通常由 4 和 -1 填充,而 b 几乎可以是任何正数或负数。

【问题讨论】:

    标签: numpy scipy linear-algebra sparse-matrix


    【解决方案1】:

    在不知道确切错误的情况下,很难说出了什么问题。我对 scipy 不太熟悉,但我怀疑如果由于系统不一致而无法解决这些问题,你会得到一个有意义的错误。

    我最好的猜测是内存问题。在高斯消元过程中,稀疏矩阵会经历大量填充,其中零变为非零。例如,沿顶行的一个非零可能会导致其下方的所有零直到对角线被填充(设置为非零)。您是否尝试过不同的节点重新排序(permc_spec 参数)?默认设置应该是一项不错的工作,但鉴于有一些内置选项,我认为不尝试它们会很愚蠢。

    有一个很好的描述它是如何工作的(用图片!)here(虽然这是 mathworks 网站,所以任何实现都会与 scipy 不同)。

    或者,如果您可以接受一个接近但不准确的答案,那么有很多迭代方法可以在很短的时间和内存需求的一小部分内得到一个近似的答案。在不了解矩阵性质的情况下,很难说哪个是最好的 - 但您可以尝试使用 here 列出的“线性方程系统的迭代方法”下的任何函数。

    【讨论】:

    • 我怀疑可能是内存问题。这是 MatLab 代码的一个端口,它使用它认为合适的任何内存。我调整了 permc_spec 参数,这似乎至少导致它抛出一个(空)异常,这是可以接受的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多