1

正方形で密な行列Bと、長方形で疎な行列Aがあります。

製品を効率的に計算する方法はありますB^-1 * Aか?

これまでのところ、私は(numpyで)使用しています

tmp = B.inv()
return tmp * A

これが A のスパース性を生み出していると私は信じています。スパース メソッドを使用することを考えて numpy.sparse.linalg.spsolveいましたが、これには A ではなく B がスパースである必要があります。

物事をスピードアップする別の方法はありますか?

4

1 に答える 1

3

反転する行列が密集しているので、spsolve欲しいツールではありません。さらに、行列の逆行列を計算して別の行列を乗算することは、数値的にはよくありません。scipy でサポートされているLU 分解を使用する方がはるかに優れています。

もう1つのポイントは、行列クラスを使用していない限り(ndarrayクラスの方が良いと思います。これは好みの問題です)、dot乗算演算子の代わりに使用する必要があるということです。また、疎行列を密行列で効率的に乗算したい場合dotは、疎行列の方法を使用する必要があります。残念ながら、これは最初の行列がまばらな場合にのみ機能するため、Anycorn が提案した転置を使用して操作の順序を入れ替えるトリックを使用する必要があります。

以下は、LU 分解を使用しない遅延実装ですが、それ以外は効率的です。

B_inv = scipy.linalg.inv(B)
C = (A.transpose().dot(B_inv.transpose())).transpose()

LU分解で適切に行うには、三角行列をスパース行列で効率的に乗算する方法を見つける必要がありますが、これは現在私にはわかりません。

于 2011-07-21T07:05:31.337 に答える