有没有简单的方法来生成从k值中提取的长度为N的排列数组?例如:
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
答案 0 :(得分:3)
更新/修正
问题实际上是要生成来自N
的所有元素长度为k
的序列。
这可以通过以下方式实现:
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> 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
(标准输出很乱)
答案 1 :(得分:3)
有一个简单的元组解决方案如下:
K = [(0,0), (0,1), (1,0), (1,1)]
vec( [(i,j) for i in K, j in K] )
如果你真的需要数组(为什么需要这个?)你可以做
K2 = [ [a...] for a in K ]
[ a for a in vec( [(i,j) for i in K2, j in K2] ) ]
如果您需要阵列数组,那么这也是可能的,但更加混乱。所以问题是,你真的不能使用元组元组吗?