2016-06-16 2 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-조합을 얻을 필요 : 어떤 도움을 크게 수정이

감사 함수 본문에 대해 생성 된 코드 수 depe하지 : 숫자 리터럴 - 사실, 루프 있도록

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

답변

6
루프의 수는 컴파일 타임 상수가 필요

처럼 보이도록했다 것 함수 인자를 찾는다. 줄리아의 생성 된 함수는 n이 단순한 값이고 어떤 인수 유형에도 속하지 않기 때문에 도움이되지 않습니다. 중첩 된 루프의 수를 갖는 가장 좋은 방법은 n과 같은 런타임 값에 따라 재귀를 사용하는 것입니다. (아직 몇 가지 예외가 있지만)

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

대부분의 경우 더 이상 Base.Cartesian 매크로를 필요가 없습니다

3
줄리아-0.4에서

이상, 당신은 지금이 작업을 수행 할 수 있습니다. n은 컴파일 타임 상수가 아니기 때문에 StefanKarpinski의 대답에서 설명한 것처럼이 루프는 "안정 형"이 아닙니다. 성능 문제가있는 경우 "기능 장벽 기술"을 사용할 수 있습니다. 이 문제와 관련된 모든 주제에 대한 자세한 내용은 http://julialang.org/blog/2016/02/iteration을 참조하십시오.