0

私はマトリックスが苦手で、他の人のコードを修正しようとしているので、ほとんどの場合、自分が何をしているのかわかりません。

問題のコードは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)です。

4

1 に答える 1

0

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が間違っていることがわかります

于 2012-08-29T14:03:13.523 に答える