提问人:HenryS 提问时间:10/27/2023 更新时间:10/27/2023 访问量:44
在 Julia 中生成用 2 个值填充固定向量的所有可能组合
Generating all possible combinations of filling a fixed vector with 2 values in Julia
问:
我想生成一个可迭代文件,它可以计算用二进制值填充向量的所有可能方法。最好是可迭代的,因为我需要在将向量存储在矩阵中之前应用选择标准。
例如,如果向量的大小为 4,则有 16 种可能性 [1,1,1,1],[1,1,1,0],[1,1,0,1],[1,0,1,1],[0,1,1,1]等。
我尝试使用 Combinatorics.jl 作为可迭代的输出似乎是理想的,但它似乎总是删除退化排列,这不是我想要的。
答:
1赞
Sundar R
10/27/2023
#1
您可以使用此函数,它返回其参数的笛卡尔乘积。它返回一个迭代器,在实现它之前,你可以应用它或其他任何东西。Iterators.product
Iterators.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)
您可以使用该函数将其作为线性向量获取,并且可以将内部元组转换为向量(如果需要),并在其上广播。所以:vec
collect
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]
评论