Julia - n 嵌套循环
Julia - n-nested loops
我正在尝试在 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
循环次数需要是一个编译时常量——一个数字文字,事实上:为函数体生成的代码不能依赖于函数参数。 Julia 的生成函数也无济于事,因为 n
只是一个普通值,而不是任何参数类型的一部分。让嵌套循环的数量取决于像 n
这样的运行时值的最佳选择是使用递归。
在 julia-0.4 及更高版本中,您现在可以这样做:
function fun(n::Int)
for I in CartesianRange(ntuple(d->1:3, n))
@show I
end
end
在大多数情况下,您不再需要 Base.Cartesian 宏(尽管仍有一些例外)。值得注意的是,正如 StefanKarpinski 的回答中所述,此循环不会 "type stable" 因为 n
不是编译时常量;如果性能很重要,您可以使用 "function barrier technique." 有关与这些问题相关的所有主题的更多信息,请参阅 http://julialang.org/blog/2016/02/iteration。
我正在尝试在 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
循环次数需要是一个编译时常量——一个数字文字,事实上:为函数体生成的代码不能依赖于函数参数。 Julia 的生成函数也无济于事,因为 n
只是一个普通值,而不是任何参数类型的一部分。让嵌套循环的数量取决于像 n
这样的运行时值的最佳选择是使用递归。
在 julia-0.4 及更高版本中,您现在可以这样做:
function fun(n::Int)
for I in CartesianRange(ntuple(d->1:3, n))
@show I
end
end
在大多数情况下,您不再需要 Base.Cartesian 宏(尽管仍有一些例外)。值得注意的是,正如 StefanKarpinski 的回答中所述,此循环不会 "type stable" 因为 n
不是编译时常量;如果性能很重要,您可以使用 "function barrier technique." 有关与这些问题相关的所有主题的更多信息,请参阅 http://julialang.org/blog/2016/02/iteration。