我使用scipy的spsolve在Python中编写程序,使用稀疏矩阵(csr_matrix)求解线性方程。矩阵相当大(M = 90826x90826,b = 90826x1),很难手工检查。
我遇到的问题是,对于我创建的一小部分矩阵,scipy.sparse.linalg.spsolve(M,b)经历了如此灾难性的失败,导致整个程序崩溃。甚至在try / except中包含该行,并且程序本身在另一个try / except中包含,也没有帮助。我甚至都没有在Exception字段中得到回复。
我手动验证我发送的数据不符合我的要求,但我无法在其他任何地方检查。我的程序涉及面部检测,问题可能是由于检测不良引起的。在这种情况下," face"被发现是在实际面部的脸颊。但是,在继续之前手动验证检测是否正确并不是一个真正的选择(最终产品将由非技术客户使用)。自动验证不在项目范围内。
无论如何,如果我能够检测到矩阵会导致spsolve崩溃,那么只需跳过图像即可。但我似乎无法找到有关如何防止spsolve崩溃的文献。
我发送float64类型的值可以是正数或负数。根据我所看到的可以解决的矩阵,M通常用4和-1来填充,而b几乎可以是任何正数或负数。
答案 0 :(得分:0)
在不知道确切错误的情况下,很难说出现了什么问题。我对scipy并不太熟悉,但我怀疑如果由于系统不一致而无法解决这些问题,你会得到一个有意义的错误。
我最好的猜测是内存问题。在高斯消元期间,稀疏矩阵可以经历大量填充,其中零变为非零。例如,沿着顶行的一个非零可能潜在地导致其下方的所有零直到填充的对角线(设置为非零)。您是否尝试过不同的节点重新排序(permc_spec参数)?默认应该是一个相当不错的工作,但鉴于有一些内置选项,我认为不尝试它们是愚蠢的。
有一个非常好的描述如何工作(图片!)here(虽然这是数学工作网站,所以任何实现都将与scipy不同)。
或者,如果您可以接受一个接近但不精确的答案,那么有很多迭代方法可以在一小部分时间和内存要求下获得近似答案。如果不了解矩阵的性质,很难说哪个是最好的 - 但是您可以尝试列出here所列的“线性方程组的迭代方法”中的任何函数。