2017-10-17 105 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字符 –