【问题标题】:How to generate all possible sample paths in Julia from vectors of unequal length如何在 Julia 中从长度不等的向量生成所有可能的样本路径
【发布时间】:2019-02-08 03:39:01
【问题描述】:

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

【问题讨论】:

    标签: julia cartesian-product julia-jump


    【解决方案1】:

    您可能正在寻找的是 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/vcatreduce 和广播是一个有趣的练习。
    • 老实说,我与它进行了斗争,并没有设法轻松获得 Matrix :-)
    • 你甚至可以放弃你已经完成的第一个vcat,直接写reduce(vcat, reduce.(hcat, a))
    • 我在答案中添加了您的评论。
    • 谢谢,这正是我想要的。顺序对我来说无关紧要!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多