Julia - n层循环嵌套

7

我正在尝试在Julia中创建一个n重循环的方法

function fun(n::Int64)
    @nloops n i d->1:3 begin\n
        @nexprs n j->(print(i_j))\n
    end
end

但是@nloops的定义仅限于:
_nloops(::Int64, ::Symbol, ::Expr, ::Expr...)

然后我收到错误提示

_nloops(::Symbol, ::Symbol, ::Expr, ::Expr)

有没有办法让这个工作?非常感谢任何帮助。

编辑:

我最终使用了组合方法。

对于我的问题,我需要获取所有k个索引的组合,以从数组中提取值,因此循环应该如下所示:

for i_1 in 1:100
    for i_2 in i_1:100
        ...
           for i_k in i_[k-1]:100

完全有同样的问题 :-) - Tarik
2个回答

6
循环的次数必须是编译时常量——实际上就是一个数字字面值:函数体生成的代码不能依赖于函数参数。由于“n”只是普通值而不是任何参数类型的一部分,Julia 的生成函数也无法帮助你。如果你想让嵌套循环的数量取决于像“n”这样的运行时值,那么最好使用递归。

5
在 Julia 0.4 及以上版本中,您现在可以这样做:
function fun(n::Int)
    for I in CartesianRange(ntuple(d->1:3, n))
        @show I
    end
end

在大多数情况下,您不再需要使用Base.Cartesian宏(尽管仍有一些例外情况)。值得注意的是,正如StefanKarpinski的答案所描述的那样,这个循环将不会是“类型稳定的”,因为n不是编译时常量;如果性能很重要,可以使用“函数屏障技术”。有关所有与这些问题相关的主题的更多信息,请参见http://julialang.org/blog/2016/02/iteration

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接