Existe-t-il une structure foreach dans MATLAB? Si oui, que se passe-t-il si les données sous-jacentes changent (c'est-à-dire si des objets 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 (initialisation; condition; incrément) dans d'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 voulez être en mesure de répondre aux changements dans la structure de données pendant les itérations, une boucle WHILE peut être plus appropriée --- vous serez en mesure de tester la condition de la boucle à chaque itération et de 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 dans d'autres langages) produit un comportement non spécifié lorsque la structure de données est modifiée pendant l'itération. Si vous avez besoin de modifier la structure de données, vous devez utiliser une instance Iterator appropriée qui permet l'ajout et la suppression d'éléments dans la collection que vous itérez. La bonne nouvelle est que MATLAB prend en charge les objets 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
Undefined function or variable 'B'
.A
s'agit d'un vecteur ligne et non d'un vecteur colonne. SiA
est une matrice, chaque k sera un vecteur colonne de cette matrice. Donc, transpose (A'
) ou vectorize (A(:)'
) si nécessaire..m
fichiers.Zach a raison sur la réponse directe à la question.
Une note latérale intéressante est que les deux boucles suivantes ne s'exécutent pas de la même manière:
La première boucle crée une variable
i
qui est un scalaire et l'itère comme une boucle C for. Notez que si vous modifiezi
dans le corps de la boucle, la valeur modifiée sera ignorée, comme le dit Zach. Dans le second cas, Matlab crée un tableau de 10 000 éléments, puis parcourt tous les éléments du tableau.Cela signifie que
fonctionne, mais
pas (parce que 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 parcourir des tableaux de cellules.
la source
La boucle MATLAB for permet une grande flexibilité, y compris lapour chaqueFonctionnalité. Voici quelques exemples:
1) Définir l'index de début, d'incrémentation et de fin
2) Boucle sur le vecteur
3) boucle sur chaîne
4) Boucle sur un tableau de cellules à une dimension
5) Boucle sur un tableau de cellules à deux dimensions
6) Utilisez les noms de champ des tableaux de structure
la source
Si vous essayez de boucler sur un tableau de cellules et d'appliquer quelque chose à chaque élément de la cellule, vérifiez
cellfun
. Il y a aussiarrayfun
,bsxfun
etstructfun
qui peut simplifier votre programme.la source
ooh! question soignée.
La boucle for de Matlab prend une matrice en entrée et itère sur ses colonnes. Matlab gère également pratiquement tout par valeur (pas de passage par référence), donc je m'attendrais à ce qu'il prenne un instantané de l'entrée de la boucle for, donc il est immuable.
voici un exemple qui peut aider à illustrer:
la source
Lors de l'itération sur des tableaux de cellules de chaînes, la variable de boucle (appelons-la
f
) devient un tableau de cellules à un seul élément. Avoir à écriref{1}
partout devient fastidieux et la modification de la variable de boucle fournit une solution de contournement propre.la source
Disons que vous avez un tableau de données:
alors vous pouvez `` foreach '' comme ceci:
Cela fera écho à tous les éléments de n (mais remplacer le i par des éléments plus intéressants est également possible bien sûr!)
la source
Je pense que c'est ce que veut vraiment l'OP:
la source
numel(array)
c'est le nombre d'éléments dans le tableau. vous vouliez peut-être dire1:numel(array)
?for i = -1:0.1:10; disp(i); end;
mieux?À partir d'aujourd'hui (27 février), il existe une nouvelle boîte à outils For-Each sur MATLAB File Exchange qui réalise le concept de
foreach
.foreach
ne fait pas partie du langage MATLAB mais l'utilisation de cette boîte à outils nous donne la possibilité d'émuler ceforeach
qui ferait.la source