从这个问题中,我想知道是否可能有一个更广义的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]
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
z = exp(einsum("j,ijl->il",x,y))
的内容? - MRule
c
。Python
实现严重依赖于nditer
迭代器。 - hpauljeinsum
可能还没有直接移植到 Julia,因为手动编写循环速度同样很快。如果我要编写它的移植版本,我可能会将其作为一个宏来实现,在解析时解码下标字符串并直接扩展为一堆 for 循环(类似于@printf
的工作方式)。 - mbauman