MATLAB Language
För öglor
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.