Y a-t-il un foreach dans MATLAB? Si oui, comment se comporte-t-il si les données sous-jacentes changent?

Existe-t-il une structure foreach dans MATLAB? Si oui, que se passe-t-il si les données sous-jacentes changent (c.-à-d. Si des objects sont ajoutés à l’ensemble)?

La boucle FOR de MATLAB est de nature statique; Vous ne pouvez pas modifier la variable de boucle entre les itérations, contrairement à la structure de boucle for (initialization; condition; increment) dans les autres langages. Cela signifie que le code suivant imprime toujours 1, 2, 3, 4, 5 quelle que soit la valeur de B.

A = 1:5; for i = A A = B; disp(i); end 

Si vous souhaitez être en mesure de répondre aux modifications de la structure de données lors des itérations, une boucle WHILE peut être plus appropriée — vous pourrez tester la condition de la boucle à chaque itération et définir la valeur de la variable de boucle ( s) comme vous le souhaitez:

 n = 10; f = n; while n > 1 n = n-1; f = f*n; end disp(['n! = ' num2str(f)]) 

Btw, la boucle for-each en Java (et éventuellement d’autres langages) produit un comportement non spécifié lorsque la structure de données est modifiée pendant l’itération. Si vous devez modifier la structure de données, vous devez utiliser une instance d’ iterator appropriée qui permet d’append et de supprimer des éléments de la collection en cours d’itération. La bonne nouvelle est que MATLAB supporte les objects Java, vous pouvez donc faire quelque chose comme ceci:

 A = java.util.ArrayList(); A.add(1); A.add(2); A.add(3); A.add(4); A.add(5); itr = A.listIterator(); while itr.hasNext() k = itr.next(); disp(k); % modify data structure while iterating itr.remove(); itr.add(k); end 

Zach a raison sur la réponse directe à la question.

Une remarque intéressante est que les deux boucles suivantes ne s’exécutent pas de la même manière:

 for i=1:10000 % do something end for i=[1:10000] % do something end 

La première boucle crée une variable i qui est un scalaire et l’itère comme une boucle C pour. Notez que si vous modifiez i dans le corps de la boucle, la valeur modifiée sera ignorée, comme dit Zach. Dans le second cas, Matlab crée un tableau à 10 k éléments, puis il parcourt tous les éléments du tableau.

Qu’est-ce que cela signifie est que

 for i=1:inf % do something end 

fonctionne, mais

 for i=[1:inf] % do something end 

ne le fait pas (car celui-ci nécessiterait d’allouer une mémoire infinie). Voir le blog de Loren pour plus de détails.

Notez également que vous pouvez itérer sur les tableaux de cellules.

MATLAB for loop permet fondamentalement une grande flexibilité, y compris la fonctionnalité foreach . Voici quelques exemples:

1) Définir les index de début, d’incrément et de fin

 for test = 1:3:9 test end 

2) Boucle sur vecteur

 for test = [1, 3, 4] test end 

3) Boucle sur corde

 for test = 'hello' test end 

4) Boucle sur un réseau de cellules à une dimension

 for test = {'hello', 42, datestr(now) ,1:3} test end 

5) Boucle sur un réseau de cellules à deux dimensions

 for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)} test(1) test(2) disp('---') end 

6) Utiliser les noms de champs des tableaux de structure

 sa = 1:3 ; sb = 10 ; for test = fieldnames(s)' s.(cell2mat(test)) end 

Si vous essayez de faire une boucle sur un tableau de cellules et d’appliquer quelque chose à chaque élément de la cellule, consultez cellfun . Il y a aussi arrayfun , bsxfun et structfun qui peuvent simplifier votre programme.

ooh! question soignée.

La boucle de Matlab prend une masortingce en entrée et itère sur ses colonnes. Matlab gère également pratiquement tout par valeur (pas de référence par référence). Je m’attendrais donc à ce qu’il prenne un instantané de l’entrée de la boucle for afin qu’elle soit immuable.

voici un exemple qui peut aider à illustrer:

 >> A = zeros(4); A(:) = 1:16 A = 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 >> i = 1; for col = A; disp(col'); A(:,i) = i; i = i + 1; end; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 >> A A = 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 

Lors d’une itération sur des tableaux de chaînes de chaînes, la variable de boucle (appelons-la f ) devient un tableau de cellules à un seul élément. Devoir écrire f{1} partout devient fastidieux et la modification de la variable de boucle fournit une solution de rechange propre.

 % This example transposes each field of a struct. sa = 1:3; sb = zeros(2,3); s % a: [1 2 3]; b: [2x3 double] for f = fieldnames(s)' s.(f{1}) = s.(f{1})'; end s % a: [3x1 double]; b: [3x2 double] % Redefining f simplifies the indexing. for f = fieldnames(s)' f = f{1}; s.(f) = s.(f)'; end s % back to a: [1 2 3]; b: [2x3 double] 

Disons que vous avez un tableau de données:

 n = [1 2 3 4 6 12 18 51 69 81 ] 

alors vous pouvez le faire comme ceci:

 for i = n, i, end 

Cela fera écho à chaque élément de n (mais remplacer le i par des éléments plus intéressants est bien sûr possible!)

Je pense que c’est ce que le PO veut vraiment:

 array = -1:0.1:10 for i=1:numel(array) disp(array(i)) end 

À compter d’aujourd’hui (27 février), il existe une nouvelle boîte à outils «For-Each» sur MATLAB File Exchange qui remplit le concept de foreach . foreach ne fait pas partie du langage MATLAB, mais l’utilisation de cette boîte à outils nous permet d’imiter ce que ferait foreach .