Это то, что вы хотите?
function funs(fs)
nf = length(fs)
@assert length(unique(size.(fs))) == 1
nx,ny = size(fs[1])
sigs = Iterators.product(ntuple(i -> 1:nf, nx*ny)...)
([fs[sig[i+(j-1)*nx]][nx,ny] for i in 1:nx, j in 1:ny] for sig in sigs)
end
Я возвращаю генератор, который вы можете легко перебрать без материализации, так как для его сбора может потребоваться слишком много памяти.Конечно, для небольших данных вы можете collect
это с дополнительным преимуществом, что это будет nx*ny
размерный массив, позволяющий вам легко разделять различные размеры.
Вот пример:
julia> fs = [fill(1,2,2), fill(2,2,2), fill(3,2,2)]
3-element Array{Array{Int64,2},1}:
[1 1; 1 1]
[2 2; 2 2]
[3 3; 3 3]
julia> funs(fs)
Base.Generator{Base.Iterators.ProductIterator{NTuple{4,UnitRange{Int64}}},getfield(Main, Symbol("##46#49")){Array{Array{Int64,2},1},Int64,Int64}}(getfield(Main, Symbol("##46#49")){Array{Array{Int64,2},1},Int64,Int64}(Array{Int64,2}[[1 1; 1 1], [2 2; 2 2], [3 3; 3 3]], 2, 2), Base.Iterators.ProductIterator{NTuple{4,UnitRange{Int64}}}((1:3, 1:3, 1:3, 1:3)))
julia> collect(funs(fs))
3×3×3×3 Array{Array{Int64,2},4}:
[:, :, 1, 1] =
[1 1; 1 1] [1 1; 2 1] [1 1; 3 1]
[2 1; 1 1] [2 1; 2 1] [2 1; 3 1]
[3 1; 1 1] [3 1; 2 1] [3 1; 3 1]
[:, :, 2, 1] =
[1 2; 1 1] [1 2; 2 1] [1 2; 3 1]
[2 2; 1 1] [2 2; 2 1] [2 2; 3 1]
[3 2; 1 1] [3 2; 2 1] [3 2; 3 1]
[:, :, 3, 1] =
[1 3; 1 1] [1 3; 2 1] [1 3; 3 1]
[2 3; 1 1] [2 3; 2 1] [2 3; 3 1]
[3 3; 1 1] [3 3; 2 1] [3 3; 3 1]
[:, :, 1, 2] =
[1 1; 1 2] [1 1; 2 2] [1 1; 3 2]
[2 1; 1 2] [2 1; 2 2] [2 1; 3 2]
[3 1; 1 2] [3 1; 2 2] [3 1; 3 2]
[:, :, 2, 2] =
[1 2; 1 2] [1 2; 2 2] [1 2; 3 2]
[2 2; 1 2] [2 2; 2 2] [2 2; 3 2]
[3 2; 1 2] [3 2; 2 2] [3 2; 3 2]
[:, :, 3, 2] =
[1 3; 1 2] [1 3; 2 2] [1 3; 3 2]
[2 3; 1 2] [2 3; 2 2] [2 3; 3 2]
[3 3; 1 2] [3 3; 2 2] [3 3; 3 2]
[:, :, 1, 3] =
[1 1; 1 3] [1 1; 2 3] [1 1; 3 3]
[2 1; 1 3] [2 1; 2 3] [2 1; 3 3]
[3 1; 1 3] [3 1; 2 3] [3 1; 3 3]
[:, :, 2, 3] =
[1 2; 1 3] [1 2; 2 3] [1 2; 3 3]
[2 2; 1 3] [2 2; 2 3] [2 2; 3 3]
[3 2; 1 3] [3 2; 2 3] [3 2; 3 3]
[:, :, 3, 3] =
[1 3; 1 3] [1 3; 2 3] [1 3; 3 3]
[2 3; 1 3] [2 3; 2 3] [2 3; 3 3]
[3 3; 1 3] [3 3; 2 3] [3 3; 3 3]