2017-10-17 152 views
0

我有兩個for循環,我想將它們合併爲一個嵌套的循環:結合兩個嵌套的for循環在一個for循環朱莉婭

我的循環是這樣的:

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 

,但我希望得到一些結果是這樣的:

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

我知道,但我想要的東西像'for ii = 1:m * n' – ReD

+2

爲什麼? --15個字符 –

+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字符 –