2 votes

Comment boucler plusieurs fois sur les éléments d'un tableau 1D ?

En supposant que size_of_array < n pour itérer plusieurs fois dans les éléments d'un tableau, j'utiliserais normalement quelque chose comme (en C++) :

for (size_t i = 0; i < n; ++i)
{
    elem = arr[ i % size_of_arr ];
} 

Si arr = {1, 2, 3}; pour elem J'aurais :

1 2 3 1 2 3 ...

Cependant, dans MATLAB / Octave, les index commencent à partir de 1 et :

for i = 1 : n

  elem = arr( mod( i, length(arr) + 1) );
end

alors quand n == length(arr) Je reçois une erreur :

error : arr(0) : les souscripteurs doivent être soit des entiers de 1 à (2^31)-1, soit des logiques.

Comment cela se fait-il lorsque les index commencent à partir de 1 ?

2 votes

La forme idiomatique pour cela est mod(i-1,n)+1 (Je l'appelle Module de base 1 ). Ainsi, peut-être elem = arr(mod(i-1, length(arr))+1); fonctionne pour vous (je ne suis pas sûr de ce que vous essayez d'obtenir)

2 votes

Ne jamais utiliser length il renvoie la longueur de la dimension la plus longue. Au lieu de cela, utilisez numel (nombre d'éléments).

0 votes

error: arr(0): Le zéro est ce sur quoi Matlab essaie de vous engueuler.

5voto

Ander Biguri Points 3358

En c++, vous feriez

arr[ i % size_of_arr]

où l'indice interne i % size_of_arr est dans l'intervalle [0 size_of_arr-1]

Dans MATLAB, i est dans l'intervalle [1 size_of_arr] il suffit donc de changer en

mod( i-1, numel(arr) ) + 1

le premier bit ( mod( i-1, numel(arr)) ) s'assure que l'index se trouve à l'intérieur de [0 size_of_arr-1] et il suffit d'ajouter 1 à ce chiffre.

1 votes

Merci ! Donc, ce que nous faisons est de décaler l'index à l'origine zéro et d'ajuster le résultat de l'opération modulo pour commencer à partir de 1 et plus, n'est-ce pas ?

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