Julia - n嵌套循环

时间:2016-06-16 13:18:01

标签: macros combinations julia nested-loops cartesian

我试图在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

2 个答案:

答案 0 :(得分:6)

循环数需要是编译时常量 - 数字文字,实际上:为函数体生成的代码不能依赖于函数参数。 Julia的生成函数也无济于事,因为n只是一个普通值而不是任何参数类型的一部分。拥有嵌套循环数量取决于n等运行时值的最佳选择是使用递归。

答案 1 :(得分:3)

在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