Réponses:
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
A
s'agit d'un vecteur ligne et non d'un vecteur colonne. Si A
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:
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 for. Notez que si vous modifiez i
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
for i=1:inf
% do something
end
fonctionne, mais
for i=[1:inf]
% do something
end
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 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
for test = 1:3:9
test
end
2) Boucle sur le vecteur
for test = [1, 3, 4]
test
end
3) boucle sur chaîne
for test = 'hello'
test
end
4) Boucle sur un tableau de cellules à une dimension
for test = {'hello', 42, datestr(now) ,1:3}
test
end
5) Boucle sur un tableau de cellules à deux dimensions
for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
test(1)
test(2)
disp('---')
end
6) Utilisez les noms de champ des tableaux de structure
s.a = 1:3 ; s.b = 10 ;
for test = fieldnames(s)'
s.(cell2mat(test))
end
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 aussi arrayfun
, bsxfun
et structfun
qui peut simplifier votre programme.
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:
>> 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 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 à écrire f{1}
partout devient fastidieux et la modification de la variable de boucle fournit une solution de contournement propre.
% This example transposes each field of a struct.
s.a = 1:3;
s.b = 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 `` foreach '' comme ceci:
for i = n, i, end
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!)
Je pense que c'est ce que veut vraiment l'OP:
array = -1:0.1:10
for i=1:numel(array)
disp(array(i))
end
numel(array)
c'est le nombre d'éléments dans le tableau. vous vouliez peut-être dire 1: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 ce foreach
qui ferait.
Undefined function or variable 'B'
.