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
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.
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.
% Strednik oznacuje prechod na novy radek
B = [ 1 2 3; 4 5 6; 7 8 9 ]
% Carka oddeluje hodnoty v radku
C = [ 10, -54, 123; 52, 8, -45; 22, 47, -8 ]
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.
Matice s jedním rozměrem = 1 -> vektor.
% Zapis "WYSIWYG" (radkovy vektor)
% Carka oddeluje hodnoty v radku (radkovy vektor)
b = [ 10, -54, 123, 52, 8 ]
Skalár je matice rozměru 1x1.
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
% Vektor od 100 po -5 do 50
% Diferenci +1 neni treba zapisovat (vektor od 1 po 1 do 100)
% Vektor o 1000 prvcich od 1 do 5 vcetne
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.
A = [ 1 2 3 ]; B = [ 3 4 ]; C = 15;
% Spojeni do jedne matice
Pro spojování dále slouží funkce: cat, horzcat, vertcat, ...
Odstranění řádků/sloupců matice
Odstranění řádků nebo sloupců provedeme zavedením tzv. prázdné proměnné [].
A = [ 1 2 3; 4 5 6; 7 8 9 ]
% Odstraneni prvniho radku
% Odstraneni druheho a tretiho sloupce
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(33) % vyber z pozice 33
A(48) % vyber z pozice 48
A(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(10:end)
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)
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.
A = rand(30,30); % matice nahodnych cisel
A( 1:5, end-3:end )
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] )
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)
0.2581 0.5888 0.5695 0.2027 0.2810
A(26:35) % vybere poslednich pet prvku prvniho sloupce a prvnich pet druheho
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.
zamestnavatel = 'CTU in Prague';
% Vypis retezce na terminal
disp( ['Prijmeni: ', prijmeni ] )
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
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
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
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]
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)
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
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
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
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
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
E = D' % pro matici realnych hodnot nema vliv (komplexni cast = 0)
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é
- pi % hodnota pi
- eps % strojove epsilon
- inf % nekonecno
- NaN % Not a number
- i, j % imaginarni jednotka
- realmin % nejmensi realne cislo
- realmax % nejvetsi realne cislo
Matice a maticové funkce
- ones % matice jednicek
- zeros % matice nul
- eye % jednotkova matice
- rand % matice nahodnych cisel
- diag % diagonalni matice
- size % velikost matice
- length % delka vektoru
- det % determinant
- inv % inverze
- eig % vlastni cisla
- rank % hodnost
- find % vyhledani prvku (A == 5, B >= 3)
- all % pravda pro vsechny nenulove
- any % pravda pro nejaky nenulovy
Matematické a statistické funkce
- abs % absolutni hodnota
- sign % signum
- sin, sind % sinus (radiany), sinus (stupne)
- cos, cosd, ... % cosinus
- asin, acos, ... % inverzni goniometricke funkce
- exp % exponenciala zakladu e
- log, log10 % prirozeny/dekadicky logaritmus
- round % zaokrouhleni na nejblizsi cele
- fix % zaokrouhleni na nizsi cele
- ceil, floor % zaokrouhleni k +inf, -inf
- real, imag % realna a imaginarni cast
- sort % razeni matice
- sum % soucet prvku matice
- min, max % minimum, maximum
- mean, median % prumer, median
- std, var % smerodatna odchylka, variance
Aproximace a interpolace
- polyfit % polynomicky fit
- polyval % vypocet polynomu z koeficientu
- spline % spline interpolace
- interp1 % 1-D interpolace
- interp2 % 2-D interpolace
- interpn % n-D interpolace
- griddata % interpolace dat nerovnomerneho gridu
Relační operátory
- == je rovno
- ~= není rovno
- < je menší
- <= je menší nebo rovno
- > je větší
- >= je větší nebo rovno
Logické operátory
- & AND, stejná priorita jako OR
- | OR, stejná priorita jako AND
- ~ NOT - nejvyšší priorita
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);
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
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:
- liniové grafy - plot, plotyy, semilogx, semilogy, loglog, area, errorbar, plot3, comet,
- scatter grafy - scatter, scatter3,
- koláčové grafy - pie, pie3,
- histogramy - hist, rose,
- prostorové grafy - surf, surfc, surfl, mesh, meshc, meshz, waterfall, ribbon, contour3,
- a mnoho dalších ...
% Vice liniovych grafu v jednom okne
X = linspace(-2*pi,2*pi,100);
% plot(X,Y1,'b-','LineWidth',2);
% plot(X,Y2,'r--','LineWidth',2);
plot(X,Y1,'b-',X,Y2,'r--','LineWidth',2);
title('Graf funkcí sin(x) a cos(x)')
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
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);
subplot(1,3,1) % rozdeleni okna na 1x3, kresba do 1. podokna
xlim([-2 2]); ylim([-2 2]); zlim([-1.1 1.1]) % nastaveni rozsahu zobrazeni
xlabel('x'); ylabel('y'); zlabel('z')
subplot(1,3,2) % rozdeleni okna na 1x3, kresba do 2. podokna
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
xlim([-2 2]); ylim([-2 2]) % nastaveni rozsahu zobrazeni
title('Graf typu contour')
THETA = linspace(0,2*pi,100);
R = sin(2*THETA).*cos(2*THETA);
title({'Polární graf','R = sin2\theta cos2\theta'}) % rozdeleni titulku do vice radku pomoci bunky {}
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
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'} )
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
disp('Podminka byla splnena.');
disp('Podminka byla splnena.');
disp('Podminka nebyla splnena.');
disp('Podminka 1 byla splnena.');
disp('Podminka 1 nebyla splnena.');
disp('Podminka 2 byla splnena.');
disp('Nebyla splnena zadna z podminek.');
end
Podminka 1 nebyla 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
- == je rovno
- ~= není rovno
- < je menší
- <= je menší nebo rovno
- > je větší
- >= je větší nebo rovno
Logické operátory
- & AND, stejná priorita jako OR
- | OR, stejná priorita jako AND
- ~ NOT - nejvyšší priorita
Dále lze využít další funkce (např. all, any), které vrací hodnoty true/false nebo jimi tvořené vektory.
if ( A > testValue1 ) && ( A < testValue2 )
disp(['A je vetsi nez ', num2str(testValue1), ...
' a mensi nez ',num2str(testValue2)]);
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ý.
disp('Promenna vek je rovna 14.')
disp('Promenna vek je rovna 15.')
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í.
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
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
xlabel('x'); ylabel('y');
xlim([0 2*pi]); ylim([-1 1]);
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.
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:
x1 = a; diference = 10; % nulta iterace
while abs(diference) > 1e-10
x2 = 1/2*(x1 + a/x1); % update x2
diference = x2 - x1; % update dif
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
disp(['NaN hodnota na pozici ', num2str(in)]);
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)
disp(['Bod ' num2str(in) ' je moc daleko'])
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
S1 = S1 + A(in); % scitani
S2 = sum( A( 1:2:end ) ) % soucet na vybrane prvky
% Priklad souctu ctvercu vybranych prvku matice
for in = 1:2:size(A,1) % cyklus pres radky
for jn = 1:2:size(A,2) % cyklus pres sloupce
A2 = A(1:2:end,1:2:end).^2; % mocneni teckovanym operatorem na vybrane prvky
S2 = sum( A2(:) ) % soucet pres vsechny prvky matice
% Nejkratsi vzdalenost mesta od bodu
X = [1034250 1034157 1034874];
Y = [ 733245 733105 733990];
X0 = 1034200; Y0 = 733100;
R(n) = sqrt((X0 - X(n))^2 + (Y0 - Y(n))^2);
Rmin2 = min( sqrt((X0 - X).^2 + (Y0 - Y).^2) )
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
Základní symbolické operace
% Definice symbolickych promennych
% Zakladni algebraicke operace
diff( cos(b) )
ans = 
diff( sin(a*b)*exp(c), b ) % parcialni derivace podle b
ans = 
int( cos(b) )
ans = 
int( sin(a)^2, a , 0 , 1 ) % urcity integral podle a od 0 do 1
ans =

% Rozvoj v Taylorovu řadu
tf = taylor( f, x, 'order', 10 )
tf =

tf = subs( tf, x, x2 )
tf =

% Dosazeni numericke hodnoty
tfn = subs( tf, x2, 10 )
tfn =

% Prevod ze symbolicke na numerickou
% Pouziti matlabFunction pro vytvoreni funkce ze symbolickeho vyrazu
tf = taylor( f, x, 'order', 10 );
exp_t = matlabFunction( tf ) % prevede symbolicky zapis na klasickou funkci
exp_t =
@(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
d = exp(xx) - exp_t(xx) % volani vytvorene funkce pri vypoctu