如何从不等长的向量生成Julia中所有可能的样本路径

时间:2019-02-08 03:39:01

标签: julia cartesian-product julia-jump

我有5个向量t1,...,t5,分别具有不等长n1,...,n5。如何在Julia中生成(n1 * ... * n5)x(5)矩阵,该矩阵为:

Svante's

1 个答案:

答案 0 :(得分:3)

您可能正在寻找的是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
...

这可能不是人们会想到的第一件事,但是可以很好地完成工作。