Julia 长度为N的向量以及来自另一个向量的元素(重复)

Julia 长度为N的向量以及来自另一个向量的元素(重复),julia,Julia,有没有简单的方法可以从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]], .

有没有简单的方法可以从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]],
    ...
]
这里需要注意的一点是:如果可能,我希望结果一直是数组(迭代器包中的
product
函数生成元组)

如果有帮助的话,Haskell等价物将是:
ReplicateM2[[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(组合(['a','b','c','d'],2))
生成正确的集合,而不考虑正在排列的元素

代码中的特定元素是行向量(即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

(标准输出很混乱)

有一个简单的元组解决方案,如下所示:

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] ) ]

如果您需要数组的数组,那么这也是可能的,但更麻烦。所以问题是,你真的不能使用元组中的元组吗?

不幸的是,这并没有生成我需要的集合:它遗漏了排列(正如你所指出的),这是一个问题,因为
kron([0,1],[1,0])!=克朗([1,0],[0,1])
。它也不包括使用重复元素的排列,例如
[[0,0],[0,0]]
。哦,对不起,问题中的术语令人困惑-这里没有排列(在这个词的适当定义中)。相应地修正答案。我需要内部对是数组,因为
kron
只接受数组(所以这很好:
([0,0],[0,1])
)。也许值得为kron编写一个包装器,然后使用更优雅的元组生成。