2016-06-29 9 views
1

私は、Pythonを使って3x3の対称でポピュライティブな多数のシステムを解決する必要があります。 nが大きい場合にはこれまでのところ、私はこれが正しい結果を生成多数の小さな線形システムを解く

res = numpy.zeros(n) 
for k, obj in enumerate(data_array): 
    # construct A, rhs, idx from obj 
    res[idx] += numpy.linalg.solve(A, rhs) 

をした、しかし、また、非常に遅いです。 (まあ...ええ。)おそらく3x3は問題のサイズではありませんsolve()を呼び出すことは意味をなさないでしょう。

ヒント

答えて

4

NumPy 1.8以降では、numpy.linalg.solve actually broadcastsです。 numpy.linalg.solve(a, b)の場合、b.ndim == a.ndim - 1の場合、ブロードキャストされた行列ベクトル解を実行します。それ以外の場合は、ブロードキャストされた行列行列解を実行します。 (この判断基準は文書化されていません。私は、ソースを見ていた。)

あなたが効率的にA sおよびrhs秒のスタックを構築することができれば、あなたは一度solveを呼び出すと、Pythonのループを回避することができます。

+0

ちょうど私が必要なもの。ありがとう! –

+0

決定基準は、ドキュメンテーションの 'a:(...、M、M)array_like'と' b:{(...、M)、(...、M、K)} 'しかし、やや秘密の形です。 –

+0

@pv .:そうではありません。例えば、あなたがそれらの形をとっていたら、 'a.shape ==(5、5、5、5)'と 'b.shape ==(5、5、4)行列とベクトルを行うには 'a.shape ==(5、5、5、5)'と 'b.shape ==(5、)'が期待されますが、NumPyは反対の解釈を選びます。 – user2357112

関連する問題