如何使任意级别的嵌套for循环

时间:2014-02-22 05:49:46

标签: julia

我可以像这样做一个两级嵌套循环

for i1 in 1:n
  for i2 in 1:n
    do something with (i1,i2)      

如何将其扩展到任意级别的嵌套循环?

例如,我可以在Python中执行此操作以循环n ^ m

的笛卡尔积
for i in (itertools.product(xrange(n),repeat=m)):

for i in (itertools.product(xrange(2),repeat=3)):
    print i

(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)

感谢@ tholy的评论。我已经成功应用了Iterators.jl。我是朱莉娅的新手,所以我的代码可能很笨拙。

for i in product(repmat(Any[1:2],3)...)
    println(i)
end

(1,1,1)
(2,1,1)
(1,2,1)
(2,2,1)
(1,1,2)
(2,1,2)
(1,2,2)
(2,2,2)

3 个答案:

答案 0 :(得分:5)

在v0.5中,Base中有一个产品迭代器,因此您现在可以将其写为Base.product(fill(1:2,3)...)fill生成一个重复某些值的数组;我发现这比创建1元素数组并调用repmat更优雅。

答案 1 :(得分:1)

Cartesian.jl包可以在某种程度上提供您想要的功能。

我对如何使用它知之甚少,但我能够至少重现Python代码的相同结果,但是由于我无法替换{{1},因此可能不够“随意”通过变量在循环体中。

3

希望有人知道这个包可以给出更好的答案。

只是额外的:Julia接受这个漂亮的循环语法:

julia> using Cartesian
julia> @nloops 3 i d->0:1 begin
          println(@ntuple 3 i)
       end
(0,0,0)
(1,0,0)
(0,1,0)
(1,1,0)
(0,0,1)
(1,0,1)
(0,1,1)
(1,1,1)

答案 2 :(得分:0)

通常,递归,函数调用自身。我必须有一个更详细的问题来给你一个更详细的回应。