Recherche…


Remarques

Itérer sur le vecteur de colonne

Une source commune de bogues est d'essayer de faire une boucle sur les éléments d'un vecteur de colonne. Un vecteur de colonne est traité comme une matrice avec une colonne. (Il n'y a en fait aucune distinction dans Matlab.) La boucle for s'exécute une fois avec la variable de boucle définie sur la colonne.

% Prints once: [3, 1]
my_vector = [1; 2; 3];
for i = my_vector
    display(size(i))
end

Modifier la variable d'itération

La modification de la variable d'itération modifie sa valeur pour l'itération en cours, mais n'a aucune incidence sur sa valeur dans les itérations suivantes.

% Prints 1, 2, 3, 4, 5
for i = 1:5
    display(i)
    i = 5; % Fail at trying to terminate the loop
end

Performance du cas particulier d' a:b dans le côté droit

L'exemple de base traite 1:n comme une instance normale de création d'un vecteur de ligne, puis itère dessus. Pour des raisons de performances, Matlab traite en fait tout a:b ou a:c:b particulier en ne créant pas entièrement le vecteur de ligne, mais en créant chaque élément un par un.

Cela peut être détecté en modifiant légèrement la syntaxe.

% Loops forever
for i = 1:1e50
end
% Crashes immediately
for i = [1:1e50]
end

Boucle 1 à n

Le cas le plus simple consiste simplement à préparer une tâche pour un nombre de fois déterminé. Disons que nous voulons afficher les nombres entre 1 et n, nous pouvons écrire:

n = 5;
for k = 1:n
    display(k)
end

La boucle exécutera les instructions internes, tout entre le for et le end , pour n fois (5 dans cet exemple):

1
2
3
4
5

Voici un autre exemple:

n = 5;
for k = 1:n
    disp(n-k+1:-1:1) % DISP uses more "clean" way to print on the screen
end

Cette fois, nous utilisons à la fois le n et le k dans la boucle pour créer un affichage "imbriqué":

 5     4     3     2     1

 4     3     2     1

 3     2     1

 2     1

 1

Itérer sur des éléments de vecteur

Le côté droit de l'affectation dans une boucle for peut être un vecteur de ligne. Le côté gauche de l'affectation peut être n'importe quel nom de variable valide. La boucle for assigne un élément différent de ce vecteur à la variable à chaque exécution.

other_row_vector = [4, 3, 5, 1, 2];
for any_name = other_row_vector
    display(any_name)
end

La sortie afficherait

4
3
5
1
2

(La version 1:n est un cas normal, car dans Matlab 1:n est juste la syntaxe pour construire un vecteur de ligne de [1, 2, ..., n] .)

Par conséquent, les deux blocs de code suivants sont identiques:

A = [1 2 3 4 5];
for x = A
  disp(x);
end

et

for x = 1:5
  disp(x);
end

Et ce qui suit sont identiques:

A = [1 3 5 7 9];
for x = A
  disp(x);
end

et

for x = 1:2:9
  disp(x);
end

Tout vecteur de ligne fera l'affaire. Ils n'ont pas besoin d'être des chiffres.

my_characters = 'abcde';
for my_char = my_characters
    disp(my_char)
end

va sortir

a
b
c
d
e

Itérer sur des colonnes de matrice

Si la partie droite de l'affectation est une matrice, la colonne se voit attribuer dans chaque itération les colonnes suivantes de cette matrice.

some_matrix = [1, 2, 3; 4, 5, 6]; % 2 by 3 matrix
for some_column = some_matrix
    display(some_column)
end

(La version vectorielle de ligne est un cas normal car, dans Matlab, un vecteur de ligne est simplement une matrice dont les colonnes sont de taille 1.)

La sortie afficherait

1
4
2
5
3
6

c'est-à-dire chaque colonne de la matrice itérée affichée, chaque colonne imprimée à chaque appel d' display .

Boucle sur les index

my_vector = [0, 2, 1, 3, 9];
for i = 1:numel(my_vector)
    my_vector(i) = my_vector(i) + 1;
end

Les opérations les plus simples réalisées avec for boucles peuvent être effectuées plus rapidement et plus facilement grâce aux opérations vectorisées. Par exemple, la boucle ci-dessus peut être remplacée par my_vector = my_vector + 1 .

Boucles imbriquées

Les boucles peuvent être imbriquées pour préformer une tâche itérée dans une autre tâche itérée. Considérons les boucles suivantes:

ch = 'abc';
m = 3;
for c = ch
    for k = 1:m
        disp([c num2str(k)]) % NUM2STR converts the number stored in k to a charachter,
                             % so it can be concataneted with the letter in c
    end
end

nous utilisons 2 itérateurs pour afficher toutes les combinaisons d'éléments abc et 1:m , ce qui donne:

a1
a2
a3
b1
b2
b3
c1
c2
c3

Nous pouvons également utiliser des boucles imbriquées pour combiner des tâches à effectuer à chaque fois et des tâches à effectuer une fois dans plusieurs itérations:

N = 10;
n = 3;
a1 = 0; % the first element in Fibonacci series
a2 = 1; % the secound element in Fibonacci series
for j = 1:N
    for k = 1:n
        an = a1 + a2; % compute the next element in Fibonacci series
        a1 = a2;      % save the previous element for the next iteration
        a2 = an;      % save ht new element for the next iteration
    end
    disp(an) % display every n'th element
end

Nous voulons ici pour calculer toutes les séries de Fibonacci , mais pour afficher uniquement le n ième élément à chaque fois, donc nous obtenons

   3
   13
   55
   233
   987
   4181
   17711
   75025
   317811
   1346269

Une autre chose que nous pouvons faire est d'utiliser le premier itérateur (externe) dans la boucle interne. Voici un autre exemple:

N = 12;
gap = [1 2 3 4 6];
for j = gap
    for k = 1:j:N
        fprintf('%d ',k) % FPRINTF prints the number k proceeding to the next the line
    end
    fprintf('\n')        % go to the next line
end

Cette fois, nous utilisons la boucle imbriquée pour formater la sortie et freiner la ligne uniquement lorsqu'un nouvel espace ( j ) entre les éléments a été introduit. Nous parcourons la largeur de l'intervalle dans la boucle externe et l'utilisons dans la boucle interne pour parcourir le vecteur:

1 2 3 4 5 6 7 8 9 10 11 12 
1 3 5 7 9 11 
1 4 7 10 
1 5 9 
1 7 

Remarque: Bizarrement, les mêmes boucles imbriquées.

Ce n'est pas quelque chose que vous verrez dans d'autres environnements de programmation. Je l'ai rencontré il y a quelques années et je ne comprenais pas pourquoi cela se passait, mais après avoir travaillé avec MATLAB pendant un certain temps, j'ai pu le comprendre. Regardez l'extrait de code ci-dessous:

for x = 1:10
    for x = 1:10
        fprintf('%d,', x);
    end
    fprintf('\n');
end

vous ne vous attendriez pas à ce que cela fonctionne correctement, mais en produisant la sortie suivante:

1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,

La raison en est que, comme avec tout le reste dans MATLAB, le compteur x est également une matrice - un vecteur pour être précis. En tant que tel, x n'est qu'une référence à un «tableau» (une structure de mémoire consécutive cohérente) qui est correctement référencé avec chaque boucle conséquente (imbriquée ou non). Le fait que la boucle imbriquée utilise le même identifiant ne fait aucune différence sur la façon dont les valeurs de ce tableau sont référencées. Le seul problème est que, dans la boucle imbriquée, le x externe est masqué par le x imbriqué (local) et ne peut donc pas être référencé. Cependant, la fonctionnalité de la structure de boucle imbriquée reste intacte.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow