Szukaj…


Uwagi

Iteruj po wektorze kolumny

Częstym źródłem błędów jest próba zapętlenia elementów wektora kolumny. Wektor kolumny traktuje się jak macierz z jedną kolumną. (W Matlabie nie ma właściwie żadnego rozróżnienia.) Pętla for uruchamiana jeden raz ze zmienną pętli ustawioną na kolumnę.

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

Zmiana zmiennej iteracyjnej

Zmiana zmiennej iteracyjnej zmienia jej wartość dla bieżącej iteracji, ale nie ma wpływu na jej wartość w kolejnych iteracjach.

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

Specjalne wykonanie przypadku a:b po prawej stronie

Podstawowy przykład traktuje 1:n jako normalną instancję tworzenia wektora wiersza, a następnie iteracji nad nim. Ze względu na wydajność Matlab faktycznie traktuje każdy a:b lub a:c:b specjalnie nie tworząc całkowicie wektora wiersza, ale zamiast tego tworząc każdy element pojedynczo.

Można to wykryć, nieznacznie zmieniając składnię.

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

Pętla 1 do n

Najprostszym przypadkiem jest po prostu wykonanie zadania określoną stałą liczbę razy. Powiedzmy, że chcemy wyświetlić liczby od 1 do n, możemy napisać:

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

Pętla wykona instrukcję wewnętrzną, wszystko między for a end , dla n razy (5 w tym przykładzie):

1
2
3
4
5

Oto inny przykład:

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

tym razem używamy zarówno n i k w pętli, aby utworzyć „zagnieżdżony” wyświetlacz:

 5     4     3     2     1

 4     3     2     1

 3     2     1

 2     1

 1

Iteruj po elementach wektora

Prawa strona przypisania w pętli for może być dowolnym wektorem wiersza. Lewa strona przypisania może być dowolną prawidłową nazwą zmiennej. Pętla for przypisuje inny element tego wektora do zmiennej przy każdym uruchomieniu.

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

Dane wyjściowe zostaną wyświetlone

4
3
5
1
2

(Wersja 1:n jest tego normalnym przypadkiem, ponieważ w Matlabie 1:n jest po prostu składnią do konstruowania wektora wiersza z [1, 2, ..., n] .)

Dlatego dwa następujące bloki kodu są identyczne:

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

i

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

I następujące są również identyczne:

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

i

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

Zrobi to dowolny wektor wiersza. Nie muszą to być liczby.

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

wyjdzie

a
b
c
d
e

Iteruj po kolumnach macierzy

Jeśli prawą stroną przypisania jest macierz, do każdej iteracji zmiennej przypisywane są kolejne kolumny tej macierzy.

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

(Wersja wektora wiersza jest tego normalnym przypadkiem, ponieważ w Matlabie wektor wiersza jest tylko macierzą, której kolumny mają rozmiar 1).

Dane wyjściowe zostaną wyświetlone

1
4
2
5
3
6

tj. każda kolumna wyświetlanej macierzy iterowanej, każda kolumna drukowana przy każdym wywołaniu display .

Pętla nad indeksami

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

Większość prostych rzeczy zrobić z for pętli można zrobić szybciej i łatwiej przez vectorized operacje. Na przykład powyższą pętlę można zastąpić my_vector = my_vector + 1 .

Pętle zagnieżdżone

Pętle można zagnieżdżać, aby wstępnie wykonać iterowane zadanie w innym iterowanym zadaniu. Rozważ następujące pętle:

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

używamy 2 iteratorów, aby wyświetlić wszystkie kombinacje elementów z abc i 1:m , co daje:

a1
a2
a3
b1
b2
b3
c1
c2
c3

Możemy również użyć zagnieżdżonych pętli, aby łączyć między zadaniami do wykonania za każdym razem, a zadaniami do wykonania raz na kilka iteracji:

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

Tutaj chcemy obliczyć całą serię Fibonacciego , ale za każdym razem wyświetlać tylko n ty element, więc otrzymujemy

   3
   13
   55
   233
   987
   4181
   17711
   75025
   317811
   1346269

Inną rzeczą, którą możemy zrobić, to użyć pierwszego (zewnętrznego) iteratora w wewnętrznej pętli. Oto inny przykład:

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

Tym razem używamy zagnieżdżonej pętli do sformatowania wyjścia i hamujemy linię tylko wtedy, gdy wprowadzono nową przerwę ( j ) między elementami. Pętlimy przez szerokość szczeliny w zewnętrznej pętli i używamy jej w wewnętrznej pętli do iteracji przez wektor:

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 

Uwaga: Dziwne pętle zagnieżdżone w liczniku.

Tego nie zobaczysz w innych środowiskach programistycznych. Natknąłem się na to kilka lat temu i nie mogłem zrozumieć, dlaczego tak się dzieje, ale po pewnym czasie pracy z MATLAB byłem w stanie to rozgryźć. Spójrz na fragment kodu poniżej:

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

nie spodziewałbyś się, że to zadziała poprawnie, ale działa, generując następujące dane wyjściowe:

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,

Powodem jest to, że podobnie jak wszystko inne w MATLAB, licznik x jest również macierzą - a konkretnie wektorem. Jako taki, x jest tylko odniesieniem do „tablicy” (spójnej, kolejnej struktury pamięci), do której odpowiednio odnosi się każda następna pętla (zagnieżdżona lub nie). Fakt, że pętla zagnieżdżona używa tego samego identyfikatora, nie ma znaczenia, w jaki sposób odwoływane są wartości z tej tablicy. Jedynym problemem jest to, że w zagnieżdżonej pętli zewnętrzny x jest ukryty przez zagnieżdżony (lokalny) x i dlatego nie można się do niego odwoływać. Jednak funkcjonalność zagnieżdżonej struktury pętli pozostaje nienaruszona.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow