Sök…


Anmärkningar

Iterera över kolumnvektorn

En vanlig källa till buggar försöker slinga över elementen i en kolumnvektor. En kolonnvektor behandlas som en matris med en kolumn. (Det finns faktiskt ingen åtskillnad i Matlab.) for loop körs en gång med loopvariabeln inställd på kolumnen.

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

Ändra iterationsvariabeln

Att ändra iterationsvariabeln ändrar dess värde för den aktuella iterationen, men har ingen inverkan på dess värde i efterföljande iterationer.

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

Specialfall utförande av a:b i höger sida

Det grundläggande exemplet behandlar 1:n som en normal instans för att skapa en radvektor och sedan iterera över den. Av prestandaskäl behandlar Matlab faktiskt alla a:b eller a:c:b speciellt genom att inte skapa radvektorn helt utan istället skapa varje element ett åt gången.

Detta kan upptäckas genom att syntaxen ändras något.

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

Ögla 1 till n

Det enklaste fallet är bara att förforma en uppgift under ett fast känt antal gånger. Säg att vi vill visa siffrorna mellan 1 till n, vi kan skriva:

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

Slingan kommer att utföra de inre uttalandena, allt mellan for och end , för n gånger (5 i detta exempel):

1
2
3
4
5

Här är ett annat exempel:

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

den här gången använder vi både n och k i loopen för att skapa en "kapslad" -skärm:

 5     4     3     2     1

 4     3     2     1

 3     2     1

 2     1

 1

Iterera över element av vektor

Den högra sidan av uppgiften i en for loop kan vara vilken radvektor som helst. Vänster sida av uppdraget kan vara vilket giltigt variabelnamn som helst. for loopen tilldelar ett annat element i denna vektor till variabeln varje körning.

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

Utdata visas

4
3
5
1
2

( 1:n versionen är ett normalt fall av detta, för i Matlab 1:n är bara syntax för att konstruera en radvektor av [1, 2, ..., n] .)

Följaktligen är de två följande kodblocken identiska:

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

och

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

Och följande är också identiska:

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

och

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

Alla radvektorer kommer att göra. De behöver inte vara siffror.

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

kommer att matas ut

a
b
c
d
e

Iterera över kolumner av matris

Om tilldelningens högra sida är en matris, tilldelas variabeln i varje iteration följande kolumner i denna matris.

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

(Radvektorversionen är ett normalt fall av detta, för i Matlab är en radvektor bara en matris vars kolumner är storlek 1.)

Utdata visas

1
4
2
5
3
6

dvs varje kolumn i den itererade matrisen visas, varje kolumn tryckt på varje display .

Slinga över index

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

De flesta enkla saker gjorda med for öglor kan göras snabbare och enklare genom vektoriserade operationer. Till exempel kan ovanstående slinga ersättas av my_vector = my_vector + 1 .

Kapslade slingor

Loops kan kapslas för att förforma iterated uppgift inom en annan iterated uppgift. Tänk på följande öglor:

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

vi använder 2 iteratorer för att visa alla kombinationer av element från abc och 1:m , vilket ger:

a1
a2
a3
b1
b2
b3
c1
c2
c3

Vi kan också använda kapslade slingor för att kombinera mellan uppgifter som ska göras varje gång och uppgifter som ska göras en gång i flera iterationer:

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

Här vill vi beräkna alla Fibonacci-serierna , men bara visa det n e elementet varje gång, så vi får

   3
   13
   55
   233
   987
   4181
   17711
   75025
   317811
   1346269

En annan sak vi kan göra är att använda den första (yttre) iteratorn i den inre slingan. Här är ett annat exempel:

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

Den här gången använder vi den kapslade slingan för att formatera utgången och bromsar linjen endast när ett nytt gap ( j ) mellan elementen infördes. Vi slingrar genom mellanrumsbredden i den yttre slingan och använder den i den inre slingan för att iterera igenom vektorn:

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 

Observera: Konstiga samma räknar kapslade slingor.

Detta är inte något du ser i andra programmeringsmiljöer. Jag stötte på det för några år tillbaka och jag kunde inte förstå varför det hände, men efter att ha arbetat med MATLAB under en tid kunde jag ta reda på det. Titta på kodavsnittet nedan:

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

du kan inte förvänta dig att detta fungerar ordentligt, men det gör, och ger följande utgång:

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,

Anledningen är att, som med allt annat i MATLAB, är x räknaren också en matris - en vektor för att vara exakt. Som sådan är x bara en hänvisning till en "matris" (en sammanhängande, i följd minnesstruktur) som på lämpligt sätt hänvisas till med varje följd slinga (kapslad eller inte). Det faktum att den kapslade slingan använder samma identifierare gör ingen skillnad i hur värden från den arrayen refereras till. Det enda problemet är att inom den kapslade slingan döljs den yttre x av den kapslade (lokala) x och därför inte kan refereras till. Funktionaliteten för den kapslade slingstrukturen förblir emellertid intakt.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow