Julia中两个有序数组的组合

Julia中两个有序数组的组合,julia,combinatorics,Julia,Combinatorics,如果我有 a=[1,3,5,7,9] b=[2,4,6,8,10] 我想创建两个列表中长度为5的每一个组合,并进行排序 到目前为止,我可以通过以下方式获得所有可能的组合: ab=hcat(a,b) collect(combinations(ab,5)) 但我只想接收32个(在本例中)有序组合 一个类似于我正在寻找的函数是Mathematica中的Tuples[Transpose@{A,b}]函数 编辑: Mathematica的输出如下 a = {1, 3, 5, 7, 9}; b = {2

如果我有

a=[1,3,5,7,9]
b=[2,4,6,8,10]
我想创建两个列表中长度为5的每一个组合,并进行排序

到目前为止,我可以通过以下方式获得所有可能的组合:

ab=hcat(a,b)
collect(combinations(ab,5))
但我只想接收32个(在本例中)有序组合

一个类似于我正在寻找的函数是Mathematica中的Tuples[Transpose@{A,b}]函数

编辑: Mathematica的输出如下

a = {1, 3, 5, 7, 9};
b = {2, 4, 6, 8, 10};
combin = Tuples[Transpose@{a, b}]
Length[combin]

Out[1]:= {{1, 3, 5, 7, 9}, {1, 3, 5, 7, 10}, {1, 3, 5, 8, 9}, {1, 3, 5, 8,
10}, {1, 3, 6, 7, 9}, {1, 3, 6, 7, 10}, {1, 3, 6, 8, 9}, {1, 3, 6,
8, 10}, {1, 4, 5, 7, 9}, {1, 4, 5, 7, 10}, {1, 4, 5, 8, 9}, {1, 4,
5, 8, 10}, {1, 4, 6, 7, 9}, {1, 4, 6, 7, 10}, {1, 4, 6, 8, 9}, {1,
4, 6, 8, 10}, {2, 3, 5, 7, 9}, {2, 3, 5, 7, 10}, {2, 3, 5, 8,
9}, {2, 3, 5, 8, 10}, {2, 3, 6, 7, 9}, {2, 3, 6, 7, 10}, {2, 3, 6,
8, 9}, {2, 3, 6, 8, 10}, {2, 4, 5, 7, 9}, {2, 4, 5, 7, 10}, {2, 4,
5, 8, 9}, {2, 4, 5, 8, 10}, {2, 4, 6, 7, 9}, {2, 4, 6, 7, 10}, {2,
4, 6, 8, 9}, {2, 4, 6, 8, 10}}

Out[2]:= 32

可能最简单的解决方案是简单地过滤掉未排序的元素<代码>过滤器(issorted,…)应该可以做到这一点。但是,这会产生26个元素,所以我可能误解了您的意图:

julia> collect(filter(issorted, combinations(ab,5)))
26-element Array{Array{Int64,1},1}:
 [1,3,5,7,9]
 [1,3,5,7,8]
 ⋮
有一个包裹。通过使用它(首先您应该通过
Pkg.add(“迭代器”)
安装它),您可以执行以下操作:

using Iterators
for p in product([1,2],[3,4],[5,6],[7,8],[9,10])
           @show p
end
输出:

p = (1,3,5,7,9)
p = (2,3,5,7,9)
p = (1,4,5,7,9)
p = (2,4,5,7,9)
p = (1,3,6,7,9)
p = (2,3,6,7,9)
p = (1,4,6,7,9)
p = (2,4,6,7,9)
p = (1,3,5,8,9)
p = (2,3,5,8,9)
p = (1,4,5,8,9)
p = (2,4,5,8,9)
p = (1,3,6,8,9)
p = (2,3,6,8,9)
p = (1,4,6,8,9)
p = (2,4,6,8,9)
p = (1,3,5,7,10)
p = (2,3,5,7,10)
p = (1,4,5,7,10)
p = (2,4,5,7,10)
p = (1,3,6,7,10)
p = (2,3,6,7,10)
p = (1,4,6,7,10)
p = (2,4,6,7,10)
p = (1,3,5,8,10)
p = (2,3,5,8,10)
p = (1,4,5,8,10)
p = (2,4,5,8,10)
p = (1,3,6,8,10)
p = (2,3,6,8,10)
p = (1,4,6,8,10)
p = (2,4,6,8,10)
编辑

要以数组或矩阵的形式获得结果,可以执行以下操作:

arr = Any[]
       for p in product([1,2],[3,4],[5,6],[7,8],[9,10])
                  push!(arr,[y for y in p])
       end
    # now arr is array of arrays. If you want matrix:
    hcat(arr...)

这是一个使用
Base.product
的v0.5解决方案

创建元组数组的步骤

julia> vec(collect(Base.product(zip(a, b)...)))
32-element Array{Tuple{Int64,Int64,Int64,Int64,Int64},1}:
 (1,3,5,7,9) 
 (2,3,5,7,9) 
 (1,4,5,7,9) 
 (2,4,5,7,9) 
 (1,3,6,7,9) 
 (2,3,6,7,9) 
 (1,4,6,7,9) 
 (2,4,6,7,9) 
 (1,3,5,8,9) 
 (2,3,5,8,9) 
 ⋮           
 (2,4,6,7,10)
 (1,3,5,8,10)
 (2,3,5,8,10)
 (1,4,5,8,10)
 (2,4,5,8,10)
 (1,3,6,8,10)
 (2,3,6,8,10)
 (1,4,6,8,10)
 (2,4,6,8,10)
并将结果收集到矩阵中

julia> hcat((collect(row) for row in ans)...)
5×32 Array{Int64,2}:
 1  2  1  2  1  2  1  2  1  2  1  2  1  …   2   1   2   1   2   1   2   1   2
 3  3  4  4  3  3  4  4  3  3  4  4  3      4   3   3   4   4   3   3   4   4
 5  5  5  5  6  6  6  6  5  5  5  5  6      6   5   5   5   5   6   6   6   6
 7  7  7  7  7  7  7  7  8  8  8  8  8      7   8   8   8   8   8   8   8   8
 9  9  9  9  9  9  9  9  9  9  9  9  9     10  10  10  10  10  10  10  10  10

你确定32岁吗?我的意思是,如果我理解正确,你试图得到所有的组合x1,x2,x3,x4,x5,其中x1呜呼,我不小心在@Matt B.的帖子上发表了我的评论。请看下面我的答案。可能是最快和内存最小的解决方案,它也使用生成器la 0.5:
([ifelse((I>>j)和1)=0,a,B)[j+1]表示j=0:4]对于i=0:31)
collect
这一行可以得到数组,但是生成器可能是需要的构造。几乎同时:)我确信它应该是32。我认为我们在回答两个不同的问题。我正在寻找的输出不会包含[1,3,5,7,8],因为位置5中的元素只能包含组合中包含的其中一个数组的位置5中的元素。因此,可能有[1,3,5,7,9]和[1,3,5,7,10],但没有[1,3,5,7,8],因为“8”来自其中一个数组的位置4<代码>组合不保留顺序,两列之间没有区别。在你的例子中,它不是你想要的。谢谢!有没有任何方法可以将结果作为数组或矩阵的数组?迭代器包的另一种方法是
map(x->[a[x];b[setdiff(1:5,x)],子集(1:5))
。它输出一个数组<但是code>setdiff应该很慢。但它足够可读。@Alejandrobaun请查看我的编辑,如果答案对您合适,请接受。我会在回到计算机后再次检查它,因为我的会议很晚,所以我没有检查stackexchange。@zwlayer这给了我所需的结果,但它涉及到将数组分离为[1,2],[3,4]格式。这个计算将是一系列计算中的一个,因此我需要找到一种方法将ab自动转换为[1,2],[3,4]格式。谢谢你提供的所有帮助!太好了:)谢谢你,这个很好用!再次感谢@zwlayer和凤阳
julia> hcat((collect(row) for row in ans)...)
5×32 Array{Int64,2}:
 1  2  1  2  1  2  1  2  1  2  1  2  1  …   2   1   2   1   2   1   2   1   2
 3  3  4  4  3  3  4  4  3  3  4  4  3      4   3   3   4   4   3   3   4   4
 5  5  5  5  6  6  6  6  5  5  5  5  6      6   5   5   5   5   6   6   6   6
 7  7  7  7  7  7  7  7  8  8  8  8  8      7   8   8   8   8   8   8   8   8
 9  9  9  9  9  9  9  9  9  9  9  9  9     10  10  10  10  10  10  10  10  10