2017-10-17 6 views
0

J'ai deux pour les boucles et je veux les combiner comme une boucle imbriquée:combiner deux boucles for imbriquées dans une boucle dans julia

mes boucles sont comme ça:

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

J'ai essayé de les combiner:

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 

de sorte que je suis arrivé à ce résultat:

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 

mais je veux obtenir un résultat comme celui-ci:

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 

Je ne sais pas comment puis-je changer mon code pour obtenir un résultat imbriqué. Il est possible de combiner deux boucles pour une boucle pour qu'elles tournent de la même façon que deux boucles sont en cours d'exécution?

+1

mais pourquoi? convertir des indices linéaires en indices cartésiens est coûteux que l'inverse ('div' est plus lent que' * '&' + '). [ici] (https://julialang.org/blog/2016/02/iteration) est un excellent article pour apprendre à faire des itérations avec 'CartesianIndex' dans Julia. – Gnimuc

Répondre

2

modifier:

Julia a de belles fonctions mathématiques et divrem est la réponse droite ! :)

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 

ancienne réponse:

Si cela est question sur Julia alors comment ne pas le faire. :)

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 

Mais vous devez voir que les performances et la lisibilité est bien pire que avec ce code:

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

c'est terrible! :-D –

+1

@ MichaelK.Borregaard Je suis d'accord! :-D Mais je pense que c'est ce que voulait OP. Et peut-être avec des milliers de processus CUDA cela pourrait l'aider à créer du code plus rapide? – Liso

+0

pourquoi il a une mauvaise performance? – ReD

3

Oui.

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

Je le sais mais je voulais quelque chose comme 'pour ii = 1: m * n' – ReD

+2

Pourquoi? --15 caractères –

+2

Peut-être que c'était l'invite de devoirs? –

2

Vous pouvez utiliser Iterators.product pour cela si votre utilisation réelle nécessite juste un itérable:

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

Y at-il une différence entre le temps de fonctionnement? Dose-il améliorer le temps de fonctionnement? – ReD

+0

Mais je ne peux pas utiliser ce code en parallèle. – ReD

+1

Pourquoi pas? --15 caractères –