是否有任何简单的方法来生成长度为 N 的排列数组,从 k 个值中提取?示例:
N = 2
k = [[0 0], [0 1], [1 0], [1 1]]
Permutations = [
[[0 0], [0 0]],
[[0 0], [0 1]],
[[0 0], [1 0]],
[[0 0], [1 1]],
[[0 1], [0 0]],
[[0 1], [0 1]],
[[0 1], [1 0]],
[[0 1], [1 1]],
...
]
这里有一个重要说明:如果可能的话,我希望结果一直是数组(Iterators 包中的 product
函数生成元组)
如果有帮助,Haskell 等价物将是:replicateM 2 [[0, 0], [0, 1], [1, 0], [1, 1]]
以防万一有更惯用的方法来实现我正在尝试做的事情,这是我正在编写的函数:
function generate_states(length)
# "tuples" contains what I want, but it needs a lot of transformation to
# be usable later
tuples = [collect(t) for t in
product([product(0:1, 0:1) for _ in 1:length]...)]
states = collect(distinct(imap(x -> kron([[i...] for i in x]...), tuples)))
return states
end
哪个有效,并且做我想做的,但理想情况下我希望它看起来像这样:
function generate_states(length)
arrays = replicateM(3, Array[[0 0], [0 1], [1 0], [1 1]])
states = collect(distinct(imap(x -> kron(x...), arrays)))
return states
end
最佳答案
更新/修复
题目实际上是想从k
中生成所有长度为N
的元素序列。
这可以通过以下方式实现:
using Iterators # install package with `Pkg.add("Iterators")`
N = 2
k = Array[[0 0], [0 1], [1 0], [1 1]]
res = [Array[e...] for e in product(fill(k,N)...)]
旧的解释 - 对象的排列
collect(combinations(['a','b','c','d'],2))
生成正确的集合,忽略被排列的元素。
代码 [0 0]
中的特定元素是行向量(即 1x2 矩阵)。这比 Julia 中的列向量更尴尬。列向量的例子是:
julia> combinations(Array[[0,0],[0,1],[1,0],[1,1]],2) |> collect
6-element Array{Array{Array{Int64,1},1},1}:
[[0,0],[0,1]]
[[0,0],[1,0]]
[[0,0],[1,1]]
[[0,1],[1,0]]
[[0,1],[1,1]]
[[1,0],[1,1]]
请注意 []
的显式类型,以防止 vcat
对内部元素进行扁平化。使用行向量,如 OP 中所示:
combinations(Array[[0 0],[0 1],[1 0],[1 1]],2) |> collect
(标准输出很乱)
关于julia - 具有来自另一个向量的元素的长度为 N 的向量(有重复),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35864784/