【发布时间】:2019-02-08 03:39:01
【问题描述】:
【问题讨论】:
标签: julia cartesian-product julia-jump
【问题讨论】:
标签: julia cartesian-product julia-jump
您可能正在寻找的是 Iterators.product,尽管它不会完全生成您所要求的内容
julia> n1, n2, n3, n4, n5 = 2, 3, 4, 5, 6;
julia> a = Iterators.product(1:n1, 1:n2, 1:n3, 1:n4, 1:n5)
Base.Iterators.ProductIterator{NTuple{5,UnitRange{Int64}}}((1:2, 1:3, 1:4, 1:5, 1:6))
julia> first(a)
(1, 1, 1, 1, 1)
julia> reduce(vcat, a)
600-element Array{NTuple{5,Int64},1}:
(1, 1, 1, 1, 1)
(2, 1, 1, 1, 1)
(1, 2, 1, 1, 1)
(2, 2, 1, 1, 1)
....
它不会创建您请求的矩阵,但大多数时候您会生成一个类似的矩阵以将其用于其他用途。在这种情况下,这样会更好,因为它可以避免分配临时矩阵。
@BogumiłKamiński 在下面的评论中写道,您可以从对象中获取一个矩阵(尽管与您的示例中的矩阵不完全相同)
julia> reduce(vcat, reduce.(hcat, a))
720×5 Array{Int64,2}:
1 1 1 1 1
2 1 1 1 1
1 2 1 1 1
...
这可能不是人们会想到的第一件事,但可以很好地完成工作。
【讨论】:
reduce(vcat, reduce.(hcat, reduce(vcat, a))) 以将其作为矩阵 :)。不是最简单的方法(并且同意通常您不需要它),但我发现使用hcat/vcat、reduce 和广播是一个有趣的练习。
vcat,直接写reduce(vcat, reduce.(hcat, a))。