2017-10-17 13 views
0

에서 루프 하나의 루프에 대한 중첩 된 두 가지를 결합 나는 루프 두하고 난 하나 개의 중첩 루프로를 결합하려는 :줄리아

내 루프는 다음과 같이이다 : 나는에 노력

for i=1:m 
    for j=1:n 
     ..... 
    end 
end 

그들을 결합 :

for ii = 1:n*m 
    ai = ii%n 
    yi = ii % m 
    if(ai == 0) 
     ai=6 
    end 
    if(yi == 0) 
     yi=5 
    end 
    println("ai=$ai , yi=$yi") 
end 

을 나는이 결과를 가지고 있도록 :

ai=1 , yi=1 
ai=2 , yi=2 
ai=3 , yi=3 
ai=4 , yi=4 
ai=5 , yi=5 
ai=6 , yi=1 
ai=1 , yi=2 
ai=2 , yi=3 
ai=3 , yi=4 
ai=4 , yi=5 
ai=5 , yi=1 
ai=6 , yi=2 
ai=1 , yi=3 
ai=2 , yi=4 
ai=3 , yi=5 
ai=4 , yi=1 
ai=5 , yi=2 
ai=6 , yi=3 
ai=1 , yi=4 
ai=2 , yi=5 
ai=3 , yi=1 
ai=4 , yi=2 
ai=5 , yi=3 
ai=6 , yi=4 
ai=1 , yi=5 
ai=2 , yi=1 
ai=3 , yi=2 
ai=4 , yi=3 
ai=5 , yi=4 
ai=6 , yi=5 
을 0

는하지만이 같은 몇 가지 결과를 얻으려면 :

ai=1 , yi=1 
ai=1 , yi=2 
ai=1 , yi=3 
ai=1 , yi=4 
ai=1 , yi=5 
ai=2 , yi=1 
ai=2 , yi=2 
ai=2 , yi=3 
ai=2 , yi=4 
ai=2 , yi=5 
ai=3 , yi=1 
ai=3 , yi=2 
ai=3 , yi=3 
ai=3 , yi=4 
ai=3 , yi=5 
ai=4 , yi=1 
ai=4 , yi=2 
ai=4 , yi=3 
ai=4 , yi=4 
ai=4 , yi=5 
ai=5 , yi=1 
ai=5 , yi=2 
ai=5 , yi=3 
ai=5 , yi=4 
ai=5 , yi=5 
ai=6 , yi=1 
ai=6 , yi=2 
ai=6 , yi=3 
ai=6 , yi=4 
ai=6 , yi=5 

내가 몇 가지 중첩 된 결과를 얻기 위해 코드를 변경하는 방법을 모르겠어요. 두 개의 for 루프를 결합하여 하나의 for 루프에 연결할 수 있으므로 두 개의 루프가 실행중인 것과 동일하게 실행됩니다.

+1

그런데 왜? 선형 인덱스를 데카르트 첨자로 변환하는 것은 다른 방법보다 비용이 많이 든다 ('div'는'*'&'+'보다 느리다). [여기] (https://julialang.org/blog/2016/02/iteration)는 Julia의'CartesianIndex'를 사용하여 반복 작업을 수행하는 방법을 배우는 훌륭한 글입니다. – Gnimuc

답변

2

편집 :

줄리아는 좋은 수학 함수와 divrem가 정답입니다있다 ! :)

for ii = 1:n*m 
    ai, yi = divrem(ii-1, n) .+ (1,1)  
    print(ai,",", yi, " ") 
end 
# Output: 1,1 1,2 1,3 1,4 2,1 2,2 2,3 2,4 3,1 3,2 3,3 3,4 

된 답 :이 줄리아에 대한 질문은 다음이다

경우를 할 수없는 방법에 대해 설명합니다. :)

m=3;n=4; 

for ii = 1:m*n 
    ai = div(ii-1, n) + 1 # division here 
    yi = (ii-1)%n + 1  # modulo here 
    print(ai,",", yi," ") 
end 

# Output: 1,1 1,2 1,3 1,4 2,1 2,2 2,3 2,4 3,1 3,2 3,3 3,4 

그러나 당신은 그 성능을 볼 필요가 가독성이 코드보다 훨씬 더입니다 :

for ai in 1:3 
    for yi in 1:4 
     print(ai,",", yi,"; ") 
    end 
end 
+1

그건 끔찍한 일이야! :-D –

+1

@ MichaelK.Borregaard 나는 동의한다! :-D 그러나 나는 그것이 OP가 원했던 것이라고 생각한다. CUDA procs를 수천 가지로 사용하면 더 빠른 코드를 만들 수 있습니다. – Liso

+0

왜 성능이 나쁜가요? – ReD

3

예.

for i=1:m, j=1:n 
    ..... 
end 
+0

나는 그것을 알고있다. 그러나 나는 'ii = 1 : m * n'과 같은 것을 원했다. – ReD

+2

왜? - 15 chars –

+2

아마도 그게 숙제 프롬프트였습니까? –

2

실제 사용하는 경우이에 대한 Iterators.product을 사용할 수있는 단 하나의 반복자가 필요합니다

julia> for (i,j) in Iterators.product(1:4, 1:3) 
      println("i=$i , j=$j") 
     end 
i=1 , j=1 
i=2 , j=1 
i=3 , j=1 
i=4 , j=1 
i=1 , j=2 
i=2 , j=2 
i=3 , j=2 
i=4 , j=2 
i=1 , j=3 
i=2 , j=3 
i=3 , j=3 
i=4 , j=3 
+0

실행 시간간에 다른 것이 있습니까? 복용량을 늘리면 실행 시간이 향상됩니까? – ReD

+0

하지만이 코드는 병렬로 사용할 수 없습니다. – ReD

+1

왜 안 되니? --15 chars –