2017-01-10 5 views
-1

次の2つの行列PとQを簡潔な形で計算したいので、すべてのインデックスをループする代わりに行列を計算できます。行列を含む方程式の簡略化された実装

enter image description here

1はpythonでこれらの行列PとQを計算するための効率的な方法だろうものを私に示唆することはできますか?私は私の実装のためのコードを添付しています。私はインデックスiとjをループするのを避け、代わりにPを単一の式で計算したい。 numpy用語

W - (M,N) shape, dtype float 
A - (M,N,N) 
x - (N,) 
p - (M,) 

でそう

import numpy as np 

def sum_matrices(i,j): 
     a=0; 
     for m in range(M+1): 
      a+= p[m]*W[m][i]*np.dot(A[m][j][:],x); 
return a; 

for i in range(N): 
    for j in range(N): 
      P[i][j]=sum_matrices(i,j); 
+1

'numpy'がwhole-をサポートしています。私はあなたのようにコーディング作業のやり直したい

===============

行列の計算 –

+0

あなたはiとjをループし、上記の式を使って$ P $の各要素を計算することを意味しますか? – pikachuchameleon

+0

あなたが改善したい現在の実装を示してください、私はあなたがコードでそれから数学でそれを見なければならないことを理解するのが楽になると思います。 –

答えて

2

表記をアインシュタインために、その場で、あなたの方程式を翻訳し、その後np.einsumに、私はあなたがしたいと思う:

Ax = np.einsum('mjk,k->mj', A, x) # sums on k 
P = np.einsum('m,mi,mj->ij', p, W, Ax) # sums on m 
pW = np.einsum('m,mi->i', p, W)  # sums on m 
Q = np.einsum('m,i,mj->ij', p, pW, Ax) # sums on m 

は明らかにそれが必要小さなMとNとサンプル配列でテストされます。私はまた方程式を深く理解しようとしなかった。私は主にインデックス表記に焦点を当てました。

def sum_matrices(i,j): 
     a=0; 
     for m in range(M): 
      a+= p[m]*W[m, i]*np.dot(A[m,j],x); 
     return a; 

def sum_matrices(i, j): 
     Ax = np.array([np.dot(A[m,j,:], x) for m in range(M)]) 
     a = p * W[:, i] * Ax 
     return a.sum() 

も参照してくださいMultiple matrix multiplication

+0

とにかくiとjのforループを排除できますか?私はこれらの行列PとQを何度も計算しなければなりません。だから私は2つのループを実行すると非常に遅くなると感じる。 – pikachuchameleon

+0

'einsum'フォームはループしません。 – hpaulj

+0

私の悪いです。したがって、上記の答えは同じ問題に対して3つの異なる解決策ですそれらのうちの2つはループを含み、einsumはループを伴わないものである。上記のループアプローチに比べて、エインザムは通常遅くなっていますか? – pikachuchameleon

関連する問題