この質問から来て、より一般化された einsum が可能だったのではないかと思います。問題があったと仮定しましょう
using PyCall
@pyimport numpy as np
a = rand(10,10,10)
b = rand(10,10)
c = rand(10,10,10)
Q = np.einsum("imk,ml,lkj->ij", a,b,c)
または同様のもの、合計をループせずにこの問題を解決するにはどうすればよいですか?
敬具
この質問から来て、より一般化された einsum が可能だったのではないかと思います。問題があったと仮定しましょう
using PyCall
@pyimport numpy as np
a = rand(10,10,10)
b = rand(10,10)
c = rand(10,10,10)
Q = np.einsum("imk,ml,lkj->ij", a,b,c)
または同様のもの、合計をループせずにこの問題を解決するにはどうすればよいですか?
敬具
編集/更新:これは現在登録済みのパッケージですPkg.add("Einsum")
。
元の回答:これを行うための非常に予備的なコードを作成しました。これは、Matt B. がコメントで説明したとおりです。問題がある場合はお知らせください。
https://github.com/ahwillia/Einsum.jl
これは、例を実装する方法です。
using Einsum
a = rand(10,10,10)
b = rand(10,10)
c = rand(10,10,10)
Q = zeros(10,10)
@einsum Q[i,j] = a[i,m,k]*b[m,l]*c[l,k,j]
内部では、マクロは次の一連のネストされた for ループを構築し、コンパイル前にそれらをコードに挿入します。(これは挿入された正確なコードではないことに注意してください。完全なコードを表示するために使用して、入力の次元が一致することも確認しmacroexpand
ます):
for j = 1:size(Q,2)
for i = 1:size(Q,1)
s = 0
for l = 1:size(b,2)
for k = 1:size(a,3)
for m = 1:size(a,2)
s += a[i,m,k] * b[m,l] * c[l,k,j]
end
end
end
Q[i,j] = s
end
end