Как сгенерировать все возможные выборочные пути в Юлии из векторов неравной длины

У меня есть 5 векторов t1,...,t5, соответствующих неравных длин n1, ..,n5. Как я могу сгенерировать (n1*...*n5)x(5) матрицу в Юлии, которая будет:

https://stackru.com/images/d7f519657d70b11059cec329f2ad bed71a62d42a.png

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
...

это, возможно, не первое, о чем можно подумать, но хорошо справляется со своей работой.

Другие вопросы по тегам