0

2つの大きな正方形のスパース行列AとBがあり、次のように計算する必要がありますA * B^-1。最も効率的な方法で。答えはを使うことだと思いますがscipy.sparse、一生理解できません。

徹底的に検索した後、私は次のスレッドに出くわしました:逆行列とスパース行列の積のための効率的なnumpy / lapackルーチン?しかし、最も効率的な方法が何であるかを理解することはできません。

誰かがscipyのスパースモジュールに組み込まれているLU分解を使用することを提案しましたが、サンプル行列でLUを実行しようとすると、結果は特異であると言われます(ただし、* B ^ -1を実行すると答えが得られます)。また、誰かがを使用することを提案しているのを聞いたことがありますlinalg.spsolve()が、2番目の引数としてベクトルが必要なため、これを実装する方法がわかりません。

それが役立つ場合は、解stが得A * B^-1 = Cられたら、行列Cの1行の値を知るだけで済みます。行列はおよそ1000x1000から1500x1500になります。

4

1 に答える 1

1

実際、1000x1000の行列はそれほど大きくありません。最新のデスクトップコンピューターでは、numpy.linalg.inv(B)を使用して1秒未満でこのような行列の逆行列を計算できます。

ただし、必要なCの行が1つだけであるという事実を考慮して問題を書き直すと、はるかに効率的になります(これは実際には非常によくあるケースです)。

d_i = [0 0 0 ... 0 1 0 ... 0]と書いてみましょう。これは、i番目の要素に1つしかないベクトルです。^ tが転置を表す場合は、次のように記述できます。

AB^-1 = C <=> A = CB <=> A^t = B^t C^t

i番目の行の場合:

A^t d_i = B^t C^t d_i <=> a_i = B^t c_i

したがって、numpy.linalg.solveを使用して解くことができる線形逆問題があります

ci = np.linalg.solve(B.T, a[i])
于 2012-08-02T08:20:33.467 に答える