在 Julia 中生成用 2 个值填充固定向量的所有可能组合

Generating all possible combinations of filling a fixed vector with 2 values in Julia

提问人:HenryS 提问时间:10/27/2023 更新时间:10/27/2023 访问量:44

问:

我想生成一个可迭代文件,它可以计算用二进制值填充向量的所有可能方法。最好是可迭代的,因为我需要在将向量存储在矩阵中之前应用选择标准。

例如,如果向量的大小为 4,则有 16 种可能性 [1,1,1,1],[1,1,1,0],[1,1,0,1],[1,0,1,1],[0,1,1,1]等。

我尝试使用 Combinatorics.jl 作为可迭代的输出似乎是理想的,但它似乎总是删除退化排列,这不是我想要的。

矢量 统计 Julia 组合

评论

0赞 Dan Getz 10/28/2023
这几乎是 stackoverflow.com/questions/77336166/ 的重复...... (那里的答案也可以在这里使用)

答:

1赞 Sundar R 10/27/2023 #1

您可以使用此函数,它返回其参数的笛卡尔乘积。它返回一个迭代器,在实现它之前,你可以应用它或其他任何东西。Iterators.productIterators.filter

julia> Iterators.product(fill([0, 1], 4)...) |> collect
2×2×2×2 Array{NTuple{4, Int64}, 4}:
[:, :, 1, 1] =
 (0, 0, 0, 0)  (0, 1, 0, 0)
 (1, 0, 0, 0)  (1, 1, 0, 0)

[:, :, 2, 1] =
 (0, 0, 1, 0)  (0, 1, 1, 0)
 (1, 0, 1, 0)  (1, 1, 1, 0)

[:, :, 1, 2] =
 (0, 0, 0, 1)  (0, 1, 0, 1)
 (1, 0, 0, 1)  (1, 1, 0, 1)

[:, :, 2, 2] =
 (0, 0, 1, 1)  (0, 1, 1, 1)
 (1, 0, 1, 1)  (1, 1, 1, 1)

您可以使用该函数将其作为线性向量获取,并且可以将内部元组转换为向量(如果需要),并在其上广播。所以:veccollect

julia> function twoones(n)
         p = Iterators.product(([0, 1] for _ in 1:n)...)
         # just an example selection criteria: combinations with exactly two 1's in them
         q = Iterators.filter(v -> count(!iszero, v) == 2, p)
         return collect.(vec(collect(q)))
       end
twoones (generic function with 1 method)

julia> twoones(4)
6-element Vector{Vector{Int64}}:
 [1, 1, 0, 0]
 [1, 0, 1, 0]
 [0, 1, 1, 0]
 [1, 0, 0, 1]
 [0, 1, 0, 1]
 [0, 0, 1, 1]