我想创建2D二进制矩阵,但是Julia意外地使用了collect
并给了我3D矩阵。
using Base.Iterators
collect(product(repeat([[0, 1]], 3)...))
输出
2×2×2 Array{Tuple{Int64,Int64,Int64},3}:
[:, :, 1] =
(0, 0, 0) (0, 1, 0)
(1, 0, 0) (1, 1, 0)
[:, :, 2] =
(0, 0, 1) (0, 1, 1)
(1, 0, 1) (1, 1, 1)
遍历未收集的结果,但按预期进行
for x in product(repeat([[0, 1]], 3)...)
println(x)
end
输出
(0, 0, 0)
(1, 0, 0)
(0, 1, 0)
(1, 1, 0)
(0, 0, 1)
(1, 0, 1)
(0, 1, 1)
(1, 1, 1)
如何将迭代器的元组收集为2D矩阵?
答案 0 :(得分:1)
您是否正在寻找类似的东西?
julia> X = product(repeat([[0, 1]], 3)...)
Base.Iterators.ProductIterator{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}(([0, 1], [0, 1], [0, 1]))
julia> X |> flatten |> collect |> x->reshape(x, (3,:))'
8×3 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
0 0 0
1 0 0
0 1 0
1 1 0
0 0 1
1 0 1
0 1 1
1 1 1
请注意,在您的特定情况下,最终矩阵的行仅与从0
到2^3-1 = 7
的二进制计数相对应。您可以直接直接构造结果:
julia> reduce(vcat, digits.(0:7, base=2, pad=3)')
8×3 Array{Int64,2}:
0 0 0
1 0 0
0 1 0
1 1 0
0 0 1
1 0 1
0 1 1
1 1 1