如何在Julia

时间:2019-06-17 17:33:39

标签: julia combinations

我正在为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

1 个答案:

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