im试图在朱莉娅
中制作一个n-nest的循环方法function fun(n::Int64)
@nloops n i d->1:3 beginn
@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
在大多数情况下,您不需要基础。Cartesian宏(尽管仍然有一些例外)。值得注意的是,正如Stefankarpinski的答案中所述,此循环不会是"类型稳定",因为n
不是编译时常数。如果性能很重要,则可以使用"功能障碍技术"。有关与这些问题相关的所有主题的更多信息,请参见http://julialang.org/blog/2016/02/iteration。