长度为N的向量与来自另一个向量的元素(有重复)

时间:2016-03-08 10:24:10

标签: 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]],
    ...
]

这里有一个重要的注意事项:如果可能,我希望结果是数组一直向下(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

2 个答案:

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

如果您需要阵列数组,那么这也是可能的,但更加混乱。所以问题是,你真的不能使用元组元组吗?