我正在为Julia中的n个数组设置庞大的0-1组合矩阵。但是,我不希望所有组合都使用,因为这会造成内存使用问题。我只想拥有一个符合某些特定条件的合法组合,条件是如果I列和J列为1,则此行不应包含在组合中。
我在https://discourse.julialang.org/t/cleanest-way-to-generate-all-combinations-of-n-arrays/20127/6中尝试了一些代码,然后删除了不需要的行,但是在2 ^ 34个组合中却失败了。
比方说,我们有n = 6,导致总共64 0-1个组合 并且我想排除元素1和4的值为1、2和5的值为1、3和6的值为1时的组合。矩阵应包含28行而不是64行,如:
0 0 0 0 0 1
0 0 0 0 1 0
0 0 0 0 1 1
0 0 0 1 0 0
0 0 0 1 0 1
0 0 0 1 1 0
0 0 0 1 1 1
0 0 1 0 0 0
0 0 1 0 1 0
0 0 1 1 0 0
0 0 1 1 1 0
0 1 0 0 0 0
0 1 0 0 0 1
0 1 0 1 0 0
0 1 0 1 0 1
0 1 1 0 0 0
0 1 1 0 0 1
0 1 1 1 0 0
1 0 0 0 0 0
1 0 0 0 0 1
1 0 0 0 1 0
1 0 0 0 1 1
1 0 1 0 0 0
1 0 1 0 1 0
1 1 0 0 0 0
1 1 0 0 0 1
1 1 1 0 0 0
0 0 0 0 0 0
答案 0 :(得分:3)
为什么需要实现整个阵列?最好在需要时动态创建每个组合,或者创建一个迭代器,一次为您提供允许的行。在您链接的讨论文章中,Stefan也https://discourse.julialang.org/t/cleanest-way-to-generate-all-combinations-of-n-arrays/20127/17也对此进行了描述,并且正如他还说的那样,在不知道您将如何使用它的情况下很难给出更多建议。
您可以创建一个迭代器,通过
可以为您提供大部分所需的信息iter = (x for x in Iterators.product(0:1, 0:1, 0:1, 0:1, 0:1, 0:1) if max(x[2] + x[5],x[1] + x[4], x[3] + x[6]) != 2)
您可以在iter
循环中迭代for
或进行以下操作:
collect(iter)
27-element Array{NTuple{6,Int64},1}:
(0, 0, 0, 0, 0, 0)
(1, 0, 0, 0, 0, 0)
(0, 1, 0, 0, 0, 0)
(1, 1, 0, 0, 0, 0)
(0, 0, 1, 0, 0, 0)
⋮
(0, 0, 0, 0, 1, 1)
(1, 0, 0, 0, 1, 1)
(0, 0, 0, 1, 1, 1)