9 votes

Quelle est la façon la plus simple d'itérer sur un tableau de tableaux ?

Soit x::Vector{Vector{T}} . Quelle est la meilleure façon d'itérer sur tous les éléments de chaque vecteur interne (c'est-à-dire tous les éléments de type T ) ? Le mieux que j'ai pu trouver est une double itération utilisant la notation à ligne unique, c'est-à-dire

for n in eachindex(x), m in eachindex(x[n])
    x[n][m]
end

mais je me demande s'il n'y a pas un seul itérateur, peut-être dans la section Iterators conçu spécifiquement à cette fin, par exemple for i in some_iterator(x) ; x[i] ; end .

Plus généralement, qu'en est-il de l'itération sur les éléments les plus internes de n'importe quel tableau de tableaux (c'est-à-dire des tableaux de n'importe quelle dimension) ?

13voto

Fengyang Wang Points 8869

Votre façon

for n in eachindex(x), m in eachindex(x[n])
    x[n][m]
end

est assez rapide. Si vous voulez la meilleure vitesse, utilisez

for n in eachindex(x)
    y = x[n]
    for m in eachindex(y)
        y[m]
    end
end

ce qui évite de déréférencer deux fois (la première déréférence est difficile à optimiser car les tableaux sont mutables, et donc getindex n'est pas pur). Sinon, si vous n'avez pas besoin de m y n vous pouvez simplement utiliser

for y in x, for z in y
    z
end

qui est également rapide.

Notez que le stockage en colonne majeure n'est pas pertinent, puisque tous les tableaux sont ici unidimensionnels.

Pour répondre à votre question générale :

  • Si le nombre de dimensions est une constante de temps de compilation, voir Base.Cartesian
  • Si le nombre de dimensions n'est pas une constante de temps de compilation, utilisez la récursion.

Et enfin, comme Dan Getz l'a mentionné dans un commentaire :

using Iterators
for z in chain(x...)
    z
end

fonctionne également. Toutefois, les performances en pâtissent quelque peu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X