Julia 中三个以上向量之间的外积

问题描述 投票:0回答:2

我正在寻找一种方法来计算 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
函数的新问题。

Julia 中没有内存分配的外积

julia tensor
2个回答
5
投票

您在这里寻找的是

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))...)...))

3
投票

整形后直接广播即可

*

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
© www.soinside.com 2019 - 2024. All rights reserved.