我正在寻找一种方法来计算 Julia 中三个以上向量之间的外积。
设
a
、b
、c
和d
是向量,每个大小分别为I
、J
、K
和L
。然后,它们的外积被定义为张量T
,其大小为I x J x K x L
,每个元素定义为
T[i,j,k,l] = a[i]*b[j]*c[k]*d[l]
Julia 中是否有任何有用的函数可以从向量中获取
T
?
编辑
我发布了一个关于没有内存分配的
outer
函数的新问题。
您在这里寻找的是
kron
。采用向量的克罗内克积将得到向量,因此您可以通过重塑获得所需的张量,因此在您的情况下
reshape(kron(d,c,b,a),(I,J,K,L))
或者更一般地说
reshape(kron(d,c,b,c),length.((a,b,c,d)))
。我通常定义一个函数来记住顺序
outer(v...) = reshape(kron(reverse(v)...),length.(v))
这就是你获取向量的外积的方法,当然你可以问是否可以更普遍地对张量做类似的事情。这里处理尺寸有点乏味,但是你可以做同样的技巧
outer(v...) = reshape(kron(reverse(vec.(v))...),tuple(vcat(collect.(size.(v))...)...))
整形后直接广播即可
*
:
julia> a,b,c,d = (rand(1+i) for i in 1:4);
julia> t4 = a .* permutedims(b) .* reshape(c,1,1,:) .* reshape(d,1,1,1,:);
julia> summary(t4)
"2×3×4×5 Array{Float64, 4}"
我的包将问题中的符号准确地翻译为这个广播:
julia> using TensorCast
julia> @cast t4c[i,j,k,l] := a[i] * b[j] * c[k] * d[l];
julia> t4c == t4
true
此操作类似于
kron
,但有点令人困惑的是,其参数的顺序并不是您所期望的列主数组。
julia> kron(b,a) ≈ vec(a .* b') ≈ @cast t2[(i,j)] := a[i] * b[j]
true
julia> kron(d,c,b,a) ≈ @cast _[(i,j,k,l)] := a[i] * b[j] * c[k] * d[l]
true