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

如何从长度不等的向量生成Julia中所有可能的样本路径,julia,cartesian-product,julia-jump,Julia,Cartesian Product,Julia Jump,我有5个向量t1,…,t5,它们各自的长度不等n1,n5。如何在Julia中生成(n1*…*n5)x(5)矩阵,即: 您可能要寻找的是迭代器。产品,尽管它不能准确生成您所要求的内容 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{

我有5个向量t1,…,t5,它们各自的长度不等n1,n5。如何在Julia中生成(n1*…*n5)x(5)矩阵,即:


您可能要寻找的是迭代器。产品,尽管它不能准确生成您所要求的内容

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))
。我在答案中添加了你的评论。谢谢,这正是我想要的。订单对我来说无关紧要!