Obsah

Základy programování v Matlabu

Příkazový řádek versus Editor

Do příkazového řádku můžeme zapisovat příkazy, jako bychom využívali "kalkulačku". Přitom lze využít veškeré nástroje a volat všechny funkce Matlabu.
Pro složitější (delší) výpočty je ale vhodnější práci postupně ukládat v Editoru. Soubory (m-fily) lze pak opakovaně snadno volat a případně korigovat zadání jednotlivých příkazů.

Nápověda

Pro podrobné seznámení se syntaxí a příklady použití jednotlivých funkcí má Matlab výborně zpracovanou nápovědu. Dialogové okno lze volat stisknutím tlačítka Help v Pracovní liště.
Další možností dotazu na podrobnosti k jednotlivým funkcím jsou příkazy help a doc.
% Vypis strucne informace k funkci sin na terminal
help sin
sin Sine of argument in radians. sin(X) is the sine of the elements of X. See also asin, sind, sinpi. Documentation for sin Other functions named sin
% Otevreni kompletni dokumentace k funkci sin
doc sin

Základy syntaxe

Příprava prostředí, komentáře

Při práci v Editoru i mimo něj je v řadě případech vhodné použít funkce clc, clear, close.
Komentář uvozujeme znakem %. Vše za ním Matlab ignoruje.
% toto je komentar
clc; % vymaze vse na terminalu
clear variables; % vymaze vsechny promenne z pameti
clear globals; % vymaze vsechny globalni promenne
close all; % zavre vsechna otevrena okna

Matice a vektory (numerická vícerozměrná pole)

Matlab umožňuje zápis matice mnoha způsoby. Přiřazení hodnot proměnné uvedeno hranatými závorkami.
% Zapis "WYSIWYG"
A = [ 1 2 3
4 5 6
7 8 9 ]
A = 3×3
1 2 3 4 5 6 7 8 9
% Strednik oznacuje prechod na novy radek
B = [ 1 2 3; 4 5 6; 7 8 9 ]
B = 3×3
1 2 3 4 5 6 7 8 9
% Carka oddeluje hodnoty v radku
C = [ 10, -54, 123; 52, 8, -45; 22, 47, -8 ]
C = 3×3
10 -54 123 52 8 -45 22 47 -8
Poznámka: Středník na závěr každého příkazu = operátor potlačení výstupu.
D = [ 1 2 3 ];
Matice s jedním rozměrem = 1 -> vektor.
% Zapis "WYSIWYG" (radkovy vektor)
a = [ 1 2 3 4 5 ]
a = 1×5
1 2 3 4 5
% Carka oddeluje hodnoty v radku (radkovy vektor)
b = [ 10, -54, 123, 52, 8 ]
b = 1×5
10 -54 123 52 8
% Sloupcovy vektor
s1 = [ 1
2
3 ]
s1 = 3×1
1 2 3
s2 = [ 1; 2; 3; 4; 5 ]
s2 = 5×1
1 2 3 4 5
Skalár je matice rozměru 1x1.
% Skalarni hodnota
K = 54
K = 54
Určení rozměru numerického pole - funkce size.
help size
size Size of array. D = size(X), for M-by-N matrix X, returns the two-element row vector D = [M,N] containing the number of rows and columns in the matrix. For N-D arrays, size(X) returns a 1-by-N vector of dimension lengths. Trailing singleton dimensions are ignored. [M,N] = size(X) for matrix X, returns the number of rows and columns in X as separate output variables. [M1,M2,M3,...,MN] = size(X) for N>1 returns the sizes of the first N dimensions of the array X. If the number of output arguments N does not equal NDIMS(X), then for: N > NDIMS(X), size returns ones in the "extra" variables, i.e., outputs NDIMS(X)+1 through N. N < NDIMS(X), MN contains the product of the sizes of dimensions N through NDIMS(X). M = size(X,DIM) returns the lengths of the specified dimensions in a row vector. DIM can be a scalar or vector of dimensions. For example, size(X,1) returns the number of rows of X and size(X,[1 2]) returns a row vector containing the number of rows and columns. M = size(X,DIM1,DIM2,...,DIMN) returns the lengths of the dimensions DIM1,...,DIMN as a row vector. [M1,M2,...,MN] = size(X,DIM) OR [M1,M2,...,MN] = size(X,DIM1,...,DIMN) returns the lengths of the specified dimensions as separate outputs. The number of outputs must equal the number of dimensions provided. When size is applied to a Java array, the number of rows returned is the length of the Java array and the number of columns is always 1. When size is applied to a Java array of arrays, the result describes only the top level array in the array of arrays. Example: If X = rand(2,3,4); then d = size(X) returns d = [2 3 4] [m1,m2,m3,m4] = size(X) returns m1 = 2, m2 = 3, m3 = 4, m4 = 1 [m,n] = size(X) returns m = 2, n = 12 m2 = size(X,2) returns m2 = 3 See also length, ndims, numel. Documentation for size Other functions named size

Zadání vektoru pomocí operátoru dvojtečka a funkce linspace

% Vektor od 1 po 2 do 100
a = 1:2:100;
% Vektor od 100 po -5 do 50
b = 100:-5:50;
% Diferenci +1 neni treba zapisovat (vektor od 1 po 1 do 100)
c = 1:100;
% Vektor o 1000 prvcich od 1 do 5 vcetne
d = linspace(1,5,1000);

Spojování matic a vektorů

Matice a vektory mohou sloužit jako submatice pro další použití. Nutné je však pamatovat na jejich rozměry a rozměr výsledné matice.
% Definice submatic
A = [ 1 2 3 ]; B = [ 3 4 ]; C = 15;
% Spojeni do jedne matice
D = [A; B C];
Pro spojování dále slouží funkce: cat, horzcat, vertcat, ...
% help cat
% help horzcat
% help vertcat

Odstranění řádků/sloupců matice

Odstranění řádků nebo sloupců provedeme zavedením tzv. prázdné proměnné [].
% Definice matice
A = [ 1 2 3; 4 5 6; 7 8 9 ]
A = 3×3
1 2 3 4 5 6 7 8 9
% Odstraneni prvniho radku
A( 1, : ) = []
A = 2×3
4 5 6 7 8 9
% Odstraneni druheho a tretiho sloupce
A( :, [2 3] ) = []
A = 2×1
4 7

Indexování

Indexování = výběr hodnot matice (řetězce) z dané pozice.
Indexujeme formou vektoru, který obsahuje čísla pozic, které chceme vybrat.
Pro označení maximálního rozměru dané matice použijeme funkci size nebo klíčové slovo end.
% Indexovani vyctem jednoho prvku
A = 1:50; % zadani matice
A(1) % vyber z pozice 1
ans = 1
A(33) % vyber z pozice 33
ans = 33
A(48) % vyber z pozice 48
ans = 48
% Indexovani vektorem
A(1:25)
ans = 1×25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
A(1:5:25)
ans = 1×5
1 6 11 16 21
A([5 10 45])
ans = 1×3
5 10 45
% Pouziti end
A(10:end)
ans = 1×41
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
A(end-10:end)
ans = 1×11
40 41 42 43 44 45 46 47 48 49 50
U výběru prvků matic můžeme použít operátor dvojtečka jako označení celého rozsahu.
% Indexovani matice
A = rand(30,30); % matice nahodnych cisel
A( 1:5, end-3:end )
ans = 5×4
0.3532 0.9406 0.6355 0.2471 0.3302 0.7359 0.3730 0.0094 0.8592 0.0476 0.0233 0.1301 0.4807 0.4729 0.5158 0.4685 0.2414 0.6618 0.9403 0.9372
A( :, [1 3 20 25] )
ans = 30×4
0.1009 0.4498 0.4714 0.2574 0.0269 0.7624 0.1356 0.9886 0.8910 0.6491 0.4482 0.8011 0.3165 0.1723 0.3119 0.6203 0.2301 0.6092 0.9501 0.7938 0.0492 0.2101 0.9366 0.4786 0.8183 0.6558 0.7402 0.9994 0.1033 0.3922 0.8691 0.4026 0.9688 0.1977 0.9571 0.8844 0.7337 0.6360 0.0432 0.5652
Výběr prvků matice můžeme provést jedním číslem nebo vektorem. V tu chvíli platí výběr tzv. po sloupcích - indexu 1 odpovídá pozice (1,1), indexu 2 odpovídá pozice (2,1), atp.
% Indexovani matice vektorem
A = rand(30,30); % matice nahodnych cisel
A(1:5)
ans = 1×5
0.2581 0.5888 0.5695 0.2027 0.2810
A(26:35) % vybere poslednich pet prvku prvniho sloupce a prvnich pet druheho
ans = 1×10
0.1109 0.3902 0.5047 0.9347 0.9859 0.6479 0.6548 0.2978 0.6937 0.8049

Textové řetězce

Textové řetězce uvozujeme jednoduchými uvozovkami.
Zobrazení textového řetězce - funkce disp.
% Textovy retezec
jmeno = 'Petr';
prijmeni = 'Pokorny';
zamestnavatel = 'CTU in Prague';
% Vypis retezce na terminal
disp( jmeno )
Petr
disp( ['Prijmeni: ', prijmeni ] )
Prijmeni: Pokorny
Poznámka: Funkce disp požaduje jako vstup jeden textový řetězec. V příkladě je ukázáno jednoduché spojení řetězce 'Prijmeni: ' a obsahu proměnné prijmeni pomocí hranatých závorek [].

Indexování řetězce

% Zadani retezce
lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.'
lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.'
lorem(1:100)
ans = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore '

Základní maticové operace

sčítání - přičtení skalární hodnoty, součet matic stejného rozměru
A = rand(5,5); B = rand(5,5);
C = A + 5 % pricte 5 vsem prvkum matice
C = 5×5
5.0640 5.1044 5.5741 5.4257 5.9712 5.9208 5.5219 5.0274 5.2522 5.2463 5.8758 5.0283 5.8166 5.9136 5.7320 5.2601 5.8675 5.3577 5.4909 5.9989 5.8846 5.1048 5.5538 5.4564 5.5559
D = A + B % soucet matic
D = 5×5
0.1357 1.0717 1.1076 1.3420 1.0425 1.0154 0.5800 0.5456 1.1974 0.3156 1.1643 0.2951 1.7658 1.7706 1.3848 1.2157 0.9200 1.2245 0.6914 1.8454 1.0163 0.7745 1.4664 1.1982 1.3614
násobení - pravidla maticového násobení (rozměry matic)
E = rand(5,3); F = rand(3,2);
G = E*F % [5x3]*[3x2] = [5x2]
G = 5×2
0.1078 0.2692 0.9712 0.8926 0.6800 0.8032 0.6381 0.5106 0.5587 0.8723
tečkovaný operátor - operace prvek po prvku pro matice stejného rozměru (násobení, mocnění, dělení prvek po prvku)
A = rand(5,3); B = rand(5,3);
C = A.*B % prvek A(i,j) vynasobi s B(i,j)
C = 5×3
0.2121 0.0847 0.0516 0.5438 0.0065 0.0688 0.3744 0.3041 0.3871 0.4693 0.1707 0.0873 0.0028 0.2627 0.0589
D = A.^B % dtto pro mocneni
D = 5×3
0.8028 0.8131 0.8033 0.9029 0.9011 0.2511 0.7183 0.7496 0.8404 0.5827 0.7166 0.9956 0.9429 0.7873 0.0809
E = A./B % a deleni
E = 5×3
1.4785 1.7757 1.6394 1.3349 2.5258 0.1756 0.9373 1.0992 1.3493 0.6173 1.0884 10.4026 4.0406 1.3088 0.0701
transpozice komplexní matice (apostrof komplexně sdružená k transponované, s tečkovaným operátorem bez komplexně sdružených hodnot)
A = [ 1 + 2i, 3, 2 - 5i; 2, 4, 6i; 1 + 1i, 5, 3 ];
B = A' % matice transponovana komplexne sdruzena
B = 3×3 complex
1.0000 - 2.0000i 2.0000 + 0.0000i 1.0000 - 1.0000i 3.0000 + 0.0000i 4.0000 + 0.0000i 5.0000 + 0.0000i 2.0000 + 5.0000i 0.0000 - 6.0000i 3.0000 + 0.0000i
C = A.' % matice pouze transponovana
C = 3×3 complex
1.0000 + 2.0000i 2.0000 + 0.0000i 1.0000 + 1.0000i 3.0000 + 0.0000i 4.0000 + 0.0000i 5.0000 + 0.0000i 2.0000 - 5.0000i 0.0000 + 6.0000i 3.0000 + 0.0000i
D = rand(3,3);
E = D' % pro matici realnych hodnot nema vliv (komplexni cast = 0)
E = 3×3
0.6601 0.4006 0.5699 0.9087 0.3423 0.8499 0.7261 0.6048 0.0355

Vybrané užitečné funkce

Speciální proměnné

Matice a maticové funkce

Matematické a statistické funkce

Aproximace a interpolace

Relační operátory

Logické operátory

Základní grafy

Liniové 2D grafy

Základní 2D graf vytváříme příkazem plot (podrobně viz doc plot). Širokou škálou příkazů můžeme specifikovat zobrazované prvky.
x = linspace(0,4*pi,1000);
y = sin(x);
figure(1) % okno grafu
plot(x,y,'b-') % modra linie
xlabel('x') % popis osy x
ylabel('y') % popis osy y
legend('y = sin(x)') % legenda
title('Graf funkce') % nadpis
grid on % mrizka
axis equal % rovnomerne osy
xlim([0 4*pi]) % limity osy x
ylim([-1.1 1.1]) % limity osy y

Graf z Workspace

Graf lze snadno generovat přímo pro proměnné z Workspace. Označíme-li vybrané proměnné, poté se odemknou možnosti v záložce Plots. V okně Figure následně můžeme měnit parametry grafu. Vše, co se provádí ve Figure, lze zapsat do kódu v Editoru. Kód grafu lze generovat z File/Generate Code.

Další typy grafů

Existuje celá řada typů grafů pro různé vizualizace:
% Vice liniovych grafu v jednom okne
X = linspace(-2*pi,2*pi,100);
Y1 = sin(X);
Y2 = cos(X);
figure
% plot(X,Y1,'b-','LineWidth',2);
% hold on
% plot(X,Y2,'r--','LineWidth',2);
% hold off
plot(X,Y1,'b-',X,Y2,'r--','LineWidth',2);
xlabel('x'); ylabel('y')
title('Graf funkcí sin(x) a cos(x)')
grid on
legend('y = sin(x)','y = cos(x)')
xlim([-pi pi]); ylim([-1.1 1.1])
% Ukazka tvorby 3D grafu - MESH
x = linspace( -2, 2, 50 ); % definice vektoru os
y = linspace( -3, 3, 100 );
[ X, Y ] = meshgrid( x, y ); % matice gird souradnic v osach, viz help meshgrid
Z = peaks( X, Y ); % integrovana funkce Matlabu
figure
mesh( X, Y, Z ); % sitovy graf
xlabel( 'x' ); ylabel( 'y' ); zlabel( 'z' ) % popis os
title( 'Peaks') % titulek
% Ukazka tvorby vice grafu v jednom okne - SUBPLOT
Z = tanh(Y.*(Y.^4 + 5*X.^4 - 10*X.^2.*Y.^2)./(X.^2 + Y.^2).^4);
figure
subplot(1,3,1) % rozdeleni okna na 1x3, kresba do 1. podokna
mesh(X,Y,Z)
grid on
xlim([-2 2]); ylim([-2 2]); zlim([-1.1 1.1]) % nastaveni rozsahu zobrazeni
xlabel('x'); ylabel('y'); zlabel('z')
title('Graf typu mesh')
subplot(1,3,2) % rozdeleni okna na 1x3, kresba do 2. podokna
contour3(X,Y,Z,15)
grid on
xlim([-2 2]); ylim([-2 2]); zlim([-1.1 1.1]) % nastaveni rozsahu zobrazeni
xlabel('x'); ylabel('y'); zlabel('z')
title('Graf typu contour3')
subplot(1,3,3) % rozdeleni okna na 1x3, kresba do 3. podokna
contour(X,Y,Z,15)
grid on
xlim([-2 2]); ylim([-2 2]) % nastaveni rozsahu zobrazeni
xlabel('x'); ylabel('y')
title('Graf typu contour')
% Polarni graf
THETA = linspace(0,2*pi,100);
R = sin(2*THETA).*cos(2*THETA);
figure
polarplot(THETA,R,'r-')
title({'Polární graf','R = sin2\theta cos2\theta'}) % rozdeleni titulku do vice radku pomoci bunky {}
% Sloupcovy graf
D = [
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013
529 525 523 529 537 529 565 604 625 642 647 641 657 651
224 269 270 275 271 272 286 296 293 301 304 302 302 303
152 149 147 146 144 148 149 151 160 167 180 179 199 217
104 130 131 141 145 144 149 152 155 154 153 166 164 170
];
figure
bar3( D( 2:end, : ) )
xlabel('rok'); zlabel('počet obyvatel')
title('Vývoj počtu obyvatel ve vybraných obcích okresu Česká Lípa v letech 2000 až 2013')
% prepsani textu os naposledy zobrazeneho grafu (gca - get handle to current axis)
set( gca, 'YTickLabel', {'Dubnice','Bezděz','Bohatice','Chotovice'}, ...
'XTickLabel', {'2000','2001','2002','2003','2004','2005','2006','2007','2008','2009','2010','2011','2012','2013'} )
% Histogram
x = randn( 1, 500 );
figure
histogram(x,20)
title( 'Histogram' )
xlabel( 'hodnota' ); ylabel( 'četnost' )

Řízení toku programu

Podmínky - příkaz if

Testuje jednu nebo více podmínek na pravdu (true/false).
% Priklad jednoduche podminky
test = true;
if test
disp('Podminka byla splnena.');
end
Podminka byla splnena.
% Priklad if/else
if test
disp('Podminka byla splnena.');
else
disp('Podminka nebyla splnena.');
end
Podminka byla splnena.
% Priklad if/elseif/else
test1 = false;
test2 = true;
if test1
disp('Podminka 1 byla splnena.');
elseif test2
disp('Podminka 1 nebyla splnena.');
disp('Podminka 2 byla splnena.');
else
disp('Nebyla splnena zadna z podminek.');
end
Podminka 1 nebyla splnena.
Podminka 2 byla splnena.
Podmínka bude splněna, kdykoli je příkaz za klíčovým if splněn. K formulaci testovacích příkazů používáme relační a logické operátory.

Relační operátory

Logické operátory

Dále lze využít další funkce (např. all, any), které vrací hodnoty true/false nebo jimi tvořené vektory.
% Priklad if
testValue1 = 1e-5;
testValue2 = 1;
A = 0.05;
if ( A > testValue1 ) && ( A < testValue2 )
disp(['A je vetsi nez ', num2str(testValue1), ...
' a mensi nez ',num2str(testValue2)]);
else
disp('A je mimo kriticky rozsah.');
end
A je vetsi nez 1e-05 a mensi nez 1
Poznámka: Využili jsme funkci num2str, která převádí numerickou hodnotu na textový řetězec.

Podmínky - příkaz switch

Větvení programu na takové případy, kdy se dotazovaná proměnná může rovnat různým hodnotám.
Počet případů (case) není omezen.
Příkaz otherwise není povinný.
vek = 15;
switch vek
case 14
disp('Promenna vek je rovna 14.')
case 15
disp('Promenna vek je rovna 15.')
otherwise
disp('Promenna vek neni 14 ani 15.')
end
Promenna vek je rovna 15.

Cykly - příkaz for

Cykly využíváme, má-li se opakovat určitá část kódu (iterace, procházení prvků matice, načítání textu řádek po řádku, ...).
Za klíčovým slovem for následuje proměnná, jejíž hodnota se v průběhu cyklu (opakování) mění (např. konstantně narůstá, ...). Hodnoty této proměnné definujeme vektorem. Délka tohoto vektoru určuje počet opakování.
% Vypsani cisel 1 az 100
for n = 1:10
disp( [ 'Cislo ' num2str(n) ] );
end
Cislo 1 Cislo 2 Cislo 3 Cislo 4 Cislo 5 Cislo 6 Cislo 7 Cislo 8 Cislo 9 Cislo 10
% Vypis lichych radku matice
A = rand(100,5); % vytvoreni matice
for idx = 1:2:size(A,1) % n je vektor 1, 3, ... az pocet radku matice
disp( A( idx, : ) );
end
0.8746 0.4361 0.1702 0.3125 0.0993 0.4780 0.2166 0.3530 0.9532 0.4586 0.4727 0.3207 0.7257 0.9127 0.0703 0.0141 0.0382 0.3730 0.2830 0.0884 0.1024 0.4473 0.2411 0.4447 0.1516 0.5475 0.1116 0.4055 0.2867 0.2419 0.7608 0.7695 0.7527 0.8989 0.9041 0.5725 0.6279 0.0924 0.4248 0.6894 0.8200 0.6127 0.6633 0.4087 0.2679 0.1461 0.9225 0.7767 0.5955 0.5107 0.0077 0.0706 0.5050 0.7830 0.2320 0.7216 0.9372 0.0618 0.3967 0.6733 0.0291 0.6694 0.4134 0.3757 0.2409 0.8157 0.3652 0.1461 0.5289 0.5058 0.3929 0.6965 0.3627 0.0211 0.5611 0.5357 0.1386 0.6859 0.0781 0.0574 0.6677 0.2885 0.0002 0.4830 0.8858 0.2785 0.8872 0.0581 0.5330 0.8227 0.2780 0.1122 0.9660 0.6879 0.9135 0.0801 0.9165 0.0708 0.2662 0.4791 0.8979 0.6852 0.3034 0.6674 0.6414 0.7821 0.5720 0.5752 0.5740 0.0772 0.8873 0.4977 0.8479 0.0754 0.6161 0.5581 0.4830 0.9674 0.3990 0.6296 0.6044 0.0124 0.3711 0.9383 0.9518 0.0444 0.4180 0.6626 0.4046 0.9103 0.2067 0.9422 0.0216 0.9755 0.0257 0.3682 0.6654 0.1920 0.1990 0.8470 0.4760 0.9280 0.1777 0.8892 0.1072 0.6993 0.2535 0.1296 0.4135 0.5788 0.0367 0.5590 0.1795 0.5880 0.1721 0.8117 0.8894 0.1111 0.1276 0.8955 0.9670 0.3328 0.2795 0.5060 0.5741 0.1926 0.4307 0.6751 0.1615 0.0242 0.1304 0.2321 0.2201 0.7287 0.7852 0.6060 0.5408 0.4788 0.0012 0.8398 0.5794 0.6908 0.9816 0.2231 0.8804 0.2449 0.6278 0.0728 0.7177 0.3681 0.5945 0.0972 0.8193 0.6761 0.6401 0.5267 0.5831 0.5518 0.4124 0.9123 0.9942 0.2962 0.0093 0.9366 0.0203 0.2546 0.6737 0.0661 0.6256 0.6324 0.1568 0.3978 0.0376 0.9949 0.1656 0.9409 0.7702 0.5387 0.0552 0.3292 0.0577 0.9139 0.8158 0.4927 0.1840 0.8524 0.9516 0.2529 0.8824 0.9001 0.7946 0.9968 0.3667 0.1367 0.5308 0.6043 0.9321 0.9182 0.1719 0.7177 0.1907 0.0189 0.1773 0.9545 0.7271 0.5172 0.3663 0.0552 0.1711 0.4743
Poznámka: Tento příklad lze řešit elegantně tzv. vektorizací (viz dále).
% Priklad jednoduche animace
x = linspace(0,2*pi,25);
y = sin(x);
bool_run = false;
if bool_run
figure
xlabel('x'); ylabel('y');
grid on; hold on;
xlim([0 2*pi]); ylim([-1 1]);
for in = 1:length(y)
plot(x(in),y(in),'x');
drawnow;
pause(0.2);
end
hold off
end

Cykly - příkaz while

While cyklus probíhá do té doby, dokud je splněna vstupní podmínka. Nemusíme znát počet opakování cyklu.
value = 5;
while value > 0.1
value = value/2;
disp(['hodnota je: ',num2str(value)])
end
hodnota je: 2.5 hodnota je: 1.25 hodnota je: 0.625 hodnota je: 0.3125 hodnota je: 0.15625 hodnota je: 0.078125
Newtonova metoda pro hledání druhé odmocniny:
a = 4;
x1 = a; diference = 10; % nulta iterace
while abs(diference) > 1e-10
x2 = 1/2*(x1 + a/x1); % update x2
diference = x2 - x1; % update dif
x1 = x2; % update x1
disp(x2); % zobrazeni
end
2.5000 2.0500 2.0006 2.0000 2.0000 2

Vynucené zastavení cyklu - příkaz break

break - vynucené zastavení for nebo while cyklu
data = [1 2 3 NaN 5 6];
for in = 1:length(data)
if isnan(data(in))
disp(['NaN hodnota na pozici ', num2str(in)]);
break;
end
end
NaN hodnota na pozici 4

Vynucené pokračování v další iteraci - příkaz continue

continue - okamžité spuštění dalšího kroku cyklu s vynecháním zbytku aktuálního
vzdalenosti = [10 21 32 12 25 16];
for in = 1:length(vzdalenosti)
if vzdalenosti(in) > 15
disp(['Bod ' num2str(in) ' je moc daleko'])
continue;
end
disp(['Bod ' num2str(in) ' je ve vzdalenosti ' num2str(vzdalenosti(in)) ' m'])
end
Bod 1 je ve vzdalenosti 10 m
Bod 2 je moc daleko Bod 3 je moc daleko
Bod 4 je ve vzdalenosti 12 m
Bod 5 je moc daleko Bod 6 je moc daleko

Funkce

viz Prezentace

Vektorizace

Vektorizace je jeden z nejsilnějších nástrojů Matlabu pro optimalizaci výpočtů na velkých souborech dat. Řada operací prováděných iterativně (pomocí cyklů apod.) lze řešit vektorizací a s využitím integrovaných funkcí Matlabu.
Využíváme zpravidla indexování pomocí vektorů, které nahradí výběr pomocí cyklu. Pro hromadnou aplikaci operátoru na vybrané prvky používáme často tečkovaný operátor.
% Priklad vektorizace souctu kazdeho licheho prvku matice
A = rand(100000,1);
% pomoci for cyklu
t1 = tic; % mereni casu
S1 = 0;
for in = 1:2:length(A)
S1 = S1 + A(in); % scitani
end
S1
S1 = 2.5105e+04
t1 = toc(t1)
t1 = 0.3394
% vektorizaci
t2 = tic;
S2 = sum( A( 1:2:end ) ) % soucet na vybrane prvky
S2 = 2.5105e+04
t2 = toc(t2)
t2 = 0.0122
% Priklad souctu ctvercu vybranych prvku matice
A = rand(100,100);
% pomoci for cyklu
t1 = tic; % mereni casu
S1 = 0;
for in = 1:2:size(A,1) % cyklus pres radky
for jn = 1:2:size(A,2) % cyklus pres sloupce
S1 = S1 + A(in,jn)^2;
end
end
S1
S1 = 810.8706
t1 = toc(t1)
t1 = 1.0692
% vektorizaci
t2 = tic;
A2 = A(1:2:end,1:2:end).^2; % mocneni teckovanym operatorem na vybrane prvky
S2 = sum( A2(:) ) % soucet pres vsechny prvky matice
S2 = 810.8706
t2 = toc(t2)
t2 = 0.0160
% Nejkratsi vzdalenost mesta od bodu
X = [1034250 1034157 1034874];
Y = [ 733245 733105 733990];
X0 = 1034200; Y0 = 733100;
% for cyklem
R = zeros(size(X));
for n = 1:length(X)
R(n) = sqrt((X0 - X(n))^2 + (Y0 - Y(n))^2);
end
Rmin = min(R)
Rmin = 43.2897
% vektorizaci
Rmin2 = min( sqrt((X0 - X).^2 + (Y0 - Y).^2) )
Rmin2 = 43.2897

Symbolické výpočty

V Matlabu lze pracovat i s analytickými vztahy, derivovat, integrovat, apod., pomocí symbolických proměnných.
% Definice symbolickych promennych
syms a b c
% Pouziti
M = a*b;
N = a/c;

Základní symbolické operace

% Definice symbolickych promennych
syms a b c
% Zakladni algebraicke operace
M = a*b; N = a/c;
% Derivace
diff( cos(b) )
ans = 
diff( sin(a*b)*exp(c), b ) % parcialni derivace podle b
ans = 
% Integrace
int( cos(b) )
ans = 
int( sin(a)^2, a , 0 , 1 ) % urcity integral podle a od 0 do 1
ans = 
% Rozvoj v Taylorovu řadu
syms x
f = exp( x );
tf = taylor( f, x, 'order', 10 )
tf = 
% Zamena promenne
syms x2
tf = subs( tf, x, x2 )
tf = 
% Dosazeni numericke hodnoty
tfn = subs( tf, x2, 10 )
tfn = 
% Prevod ze symbolicke na numerickou
tfn = eval( tfn )
tfn = 1.0087e+04
% Pouziti matlabFunction pro vytvoreni funkce ze symbolickeho vyrazu
syms x
f = exp( x );
tf = taylor( f, x, 'order', 10 );
exp_t = matlabFunction( tf ) % prevede symbolicky zapis na klasickou funkci
exp_t = function_handle with value:
@(x)x+x.^2./2.0+x.^3./6.0+x.^4./2.4e+1+x.^5./1.2e+2+x.^6./7.2e+2+x.^7./5.04e+3+x.^8./4.032e+4+x.^9./3.6288e+5+1.0
xx = 0.5;
d = exp(xx) - exp_t(xx) % volani vytvorene funkce pri vypoctu
d = 2.8188e-10