【问题标题】:Python: scipy.spsolve crashes without errorPython:scipy.spsolve 崩溃而没有错误
【发布时间】:2012-08-29 08:03:55
【问题描述】:

我不太擅长矩阵,而且大部分时间我都不知道自己在做什么,因为我正在尝试修复别人的代码。

有问题的代码是 new_vals = scipy.sparse.linalg.spsolve(A,b),其中 A 是具有以下维度的稀疏矩阵:(1146880, 1146880),b 是 (1146880, 1)。当 python 崩溃时,没有错误,我很确定它没有内存不足。一些搜索表明它是堆栈溢出的一种形式,因此我尝试使用 bicg 制定不同的解决方案,但 new_vals,check = scipy.sparse.linalg.bicg(A,b) 似乎并不总是有效。

他们有什么方法可以让 spsolve 工作吗?还是有其他方法可以做到这一点?

编辑:我之前说过两个矩阵的大小相同,但 b 是 (1146880, 1)。

【问题讨论】:

  • 如果某些东西在 Scipy 中不起作用,或者某些东西崩溃,并且您确定问题不在您的代码中,请在此处提交错误报告:projects.scipy.org/scipy 请务必提及您使用的 Scipy 版本有(检查scipy.__version__),以及其他人重现该问题的方法。如果您使用的是旧 Scipy 版本,最好尝试使用新版本。

标签: python opencv matrix numpy scipy


【解决方案1】:

1) “似乎并不总是有效”是什么意思? bicg 是否会因info!=0 而失败?这并不奇怪,因为A 是不可逆的。输入,特别是矩阵A,是否有可能是错误的?

2) spsolve 在相同的情况下会失败吗 bicg 会失败吗?

编辑:在回复评论时,我不相信 spsolve。这是一个失败的例子:

import scipy.sparse
import scipy.sparse.linalg

A=scipy.sparse.csc_matrix(linspace(1,15,16).reshape((4,4)))
b=ones((4))
res_spsolve=scipy.sparse.linalg.spsolve(A,b)
res_bicg,info=scipy.sparse.linalg.bicg(A,b)


b_bicg = A*res_bicg
b_spsolve = A*res_spsolve

你会发现 b_spsolve 是错误的

【讨论】:

  • bicginfo=-10 失败。我实际上根本无法让bicg 工作,即使在矩阵为 (81920, 81920) 的情况下,spsolve 工作得很好。
  • 好吧,我不相信 spsolve。这是一个失败的例子:
  • 好吧,就我而言,我正在使用从spsolve 找到的x 应用图像转换,所以通过工作我的意思是我得到了正确的转换/结果。那有没有其他方法可以得到我的结果?
  • 嗯,我觉得很奇怪bicg 总是失败。你能检查一下numpy.linalg.det(A)!=0,还是矩阵太大了?如果它为零或非常接近它,我认为算法本身可能有问题
  • 哦,A 是一个稀疏矩阵...(如果这改变了什么的话)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 2021-09-11
  • 1970-01-01
相关资源
最近更新 更多