7

この質問から来て、より一般化された 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)

または同様のもの、合計をループせずにこの問題を解決するにはどうすればよいですか?

敬具

4

1 に答える 1

6

編集/更新:これは現在登録済みのパッケージです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
于 2016-04-17T05:41:27.737 に答える