Julia 长度为N的向量以及来自另一个向量的元素(重复)
有没有简单的方法可以从k值生成长度为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]], .
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编写一个包装器,然后使用更优雅的元组生成。