14

(150000,150000)次のように大きな疎行列を反転しようとしています:

import scipy as sp
import scipy.sparse.linalg as splu

#Bs is a large sparse matrix with shape=(150000,150000)

#calculating the sparse inverse
iBs=splu.inv(Bs)

次のエラー メッセージが表示されます。

Traceback (most recent call last):
    iBs=splu.inv(Bs)
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py", line 134, in spsolve
autoTranspose=True)
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 603, in linsolve
self.numeric(mtx)
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/dsolve/umfpack/umfpack.py", line 450, in numeric
umfStatus[status]))
RuntimeError: <function umfpack_di_numeric at 0x7f2c76b1d320> failed with UMFPACK_ERROR_out_of_memory

線形微分方程式系を単純に解くようにプログラムを再調整しました。

import numpy as np

N=Bs.shape[0]

I=np.ones(N)

M=splu.spsolve(Bs,I)

そして、私は再び同じエラーに遭遇します

私はこのコードを 16 GB の RAM を搭載したマシンで使用していましたが、それを 32 GB の RAM を搭載したサーバーに移動しましたが、それでも役に立ちませんでした。

誰もこれに遭遇したことがありますか?

4

2 に答える 2

4

最初に、この質問は、計算科学と数値線形代数の専門家の素晴らしいコミュニティがあるhttp://scicomp.stackexchange.comで質問する方がよいと言わせてください。

基本から始めましょう:スパース行列を反転しないでください。完全に無意味です。MATLAB centralに関するこのディスカッション、特にTim Davis によるこのコメントを参照してください。

簡単に言うと、行列を数値的に反転するアルゴリズムはありません。NxN 行列の逆行列を数値的に計算しようとすると、単位行列の列に対応する N 個の rhs ベクトルを使用して、実際には N 個の線形システムを解きます。

つまり、計算すると

from scipy.sparse import eye
from scipy.sparse.linalg import (inv, spsolve)

N = Bs.shape[0]
iBs = inv(Bs)
iBs = spsolve(Bs, eye(N))

最後の 2 つのステートメント (inv(eye)およびspsolve(Bs, eye(N))) は同等です。質問が誤って想定しているように、単位行列 ( eye(N)) は1 のベクトル ( ) ではないことに注意してください。np.ones(N)

ここでのポイントは、数値線形代数では逆行列がほとんど役に立たないということです。Ax = b の解は、inv(A)*b として計算されるのではなく、特殊なアルゴリズムによって計算されます。

あなたの特定の問題に行くと、方程式の大きなまばらなシステムには、ブラックボックスソルバーはありません。マトリックス問題の構造と特性をよく理解している場合にのみ、正しいクラスのソルバーを選択できます。マトリックスのプロパティは、解決しようとしている問題の結果です。たとえば、FEM によって楕円偏微分方程式のシステムを離散化すると、代数方程式の対称正スパース システムになります。問題の特性がわかれば、正しい解決戦略を選択できます。

あなたの場合、方程式を並べ替えずに、一般的な直接ソルバーを使用しようとしています。iBsこれにより、関数の最初のフェーズ (因数分解である必要があります) で行列のスパース性を破壊するフィルインが生成されることはよく知られていますspsolve。完全な倍精度の 150000 x 150000 行列には、約 167 GB のメモリが必要であることに注意してください。 . 因数分解中のフィルインを減らすために方程式を並べ替えるテクニックはたくさんありますが、賢明なヒントを提供するのに十分な情報を提供していません。

申し訳ありませんが、http: //scicomp.stackexchange.com で質問を再構成することを検討する必要があります。解決しようとしている問題を明確に示して、マトリックスの構造とプロパティの手がかりを与えてください。

于 2016-01-23T23:26:13.757 に答える
0

スパース配列は、行列のゼロ以外のエントリのみをメモリに収めます。ここで、反転を行うとします。これは、行列のほとんどすべてのエントリが非ゼロになることを意味します。スパース行列はメモリ最適化されています。

「スペア」プロパティを失うことなく疎行列に適用できる操作がいくつかあります。

  • さらに、定数を追加するだけで、疎行列を疎に保つことができます。
于 2016-01-21T12:35:30.613 に答える