2016-06-16 5 views
4

ジュリアジュリア - のn-ネストされたループ

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

のnネストされたループ方式をしようとしてイムしかし@nloops定義は

_nloops(::Int64, ::Symbol, ::Expr, ::Expr...) 

に限定されており、私はエラーを取得する

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

この方法を使用する方法はありますか?私は私の問題のための組み合わせ方法

を使用していたやってしまった何を

、私は配列から値を引っ張ってインデックスのすべてのkの組み合わせを得るために必要:すべてのヘルプは大EDITは

を高く評価しました関数本体用に生成されたコードはDEPEことはできません。実際には、数値リテラル - ループが

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

答えて

6

のように見えなければならなかっただろうので、ループの数は、コンパイル時定数である必要があります関数の引数にnd。 Juliaの生成関数は、nが単なる値であり、引数の型の一部ではないため、どちらの助けにもなりません。ネストされたループの数を持つための最善の策は、再帰を使用することですnのような実行時の値に依存します。 (まだいくつかの例外はあるものの)

function fun(n::Int) 
    for I in CartesianRange(ntuple(d->1:3, n)) 
     @show I 
    end 
end 

ほとんどの場合、あなたはもうBase.Cartesianマクロを必要としない:

3
ジュリア-0.4では

以上、あなたは今、これを行うことができます。これは、StefanKarpinskiの答えと同じように、nはコンパイル時定数ではないため、このループは「型安定」ではないことに注意してください。パフォーマンスが重要な場合は、「機能障壁技術」を使用できます。これらの問題に関連するすべてのトピックの詳細については、http://julialang.org/blog/2016/02/iterationを参照してください。