Základy programování v Matlabu - část 1
Ing. Petr Pokorný, Ph.D.
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
% 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 ]
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.
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
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
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(26:35) % vybere poslednich pet prvku prvniho sloupce a prvnich pet druheho
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.'
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
násobení - pravidla maticového násobení (rozměry matic)
E = rand(5,3); F = rand(3,2);
G = E*F % [5x3]*[3x2] = [5x2]
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)
D = A.^B % dtto pro mocneni
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
C = A.' % matice pouze transponovana
E = D' % pro matici realnych hodnot nema vliv (komplexni cast = 0)
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
Příklady
Příklad 1
Prozkoumejte funkce help a doc. Najděte a prostudujte nápovědu např. pro funkce: who, whos, linspace, atan, sin, figure, plot, meshgrid, surf, syms, eval.
Příklad 2
Vytvořte skript promenne1.m . V úvodu skriptu vyčistěte paměť, příkazový řádek a uzavřete veškerá ostatní okna (clc, close all, clear all). Zapište a vypočtěte následující, každou skupinu oddělte komentářem.
Proměnné:
- zapište proměnnou A rovnu 10,
- B rovnu 25 desetinám násobenou 23. mocninou deseti (využijte 1e+N),
- komplexní proměnnou C s reálnou částí 2 a imaginární 3,
- proměnnou D jako komplexní číslo v Eulerově formě zápisu s argumentem 2π/3.
Vektory:
- zapište řádkový vektor V1 o 20 prvcích lineárně dělených od −1 do 1 (linspace),
- řádkový vektor V2 a třech prvcích odpovídajících datu vašeho narození (ve formátu DD, MM, YYYY),
- sloupcový vektor V3 o šesti prvcích odpovídajících prvním šesti číslicím vašeho rodného čísla,
- vektor V4 obsahující Vaše křestní jméno.
Matice:
- zapište plnou matici M1 rozměru 10x10 o prvcích 5 (ones, zeros, …),
- diagonální matici M2 rozměru 5x5 s diagonálními prvky od 1 do 5 (diag, zeros, …),
- matici M3 náhodných reálných čísel rozměru 3x4 v rozmezí −5 do 5 (rand, …),
- matici M4 rozměru 5x5 hodnot NaN (nan, …),
- matici M5 rozměru 10x10 hodnot od 1 do 100 rostoucích po sloupcích (reshape, ...).
Skalární rovnice:
Vypočtěte (exp, sqrt, nthroot, log, real, sin, conj, ...):


Vektorové rovnice a manipulace s vektory:
Vypočtěte, rovnice řešte po prvcích (.*, .^, …):



Maticová algebra a indexování:
Vypočtěte (inv, det, ...):




Často používané funkce a indexování vektorů a matic:
- Určete velikost matice M1 (size, …).
- Sečtěte po sloupcích matici M3. Výsledkem by měl být řádkový vektor (sum, …).
- Vypočtěte průměr z jednotlivých řádků matice M9. Výsledkem by měl být sloupcový vektor (mean, …).
- Nahraďte první řádek matice M1 jednotkovým vektorem (ones, size, …).
- Vypište prvky matice M3 v druhém sloupci od 2. řádku do konce (end, …).
- Vytvořte vektor V8 lineárně rostoucích čísel od 1 do 20 s krokem 1. Následně každou druhou číslici v řadě převeďte na zápornou, V8 = [1, −2, 3, −4, …, −20].
- Vytvořte vektor V9 rozměru 1x5 náhodných čísel s normálním rozdělením (střední hodnota = 1, směrodatná odchylka = 0.5). Najděte ta čísla, která jsou větší než 1, a nastavte je na 0 (randn, find, …).
- Vytvořte matici M10, která vznikne horizontálním spojením matic M2 a M4 (horzcat, …).
- Vytvořte matici M11, která vznikne vertikálním spojením matic M1 a M10 (vertcat, …).
- Vytvořte matici M12, která vznikne horizontálním převrácením matice M5. Dále takto vzniklou matici převraťte vertikálně (fliplr, flipud). Porovnejte s maticí, která vznikne dvojnásobnou rotací matice M5 proti směru hodinových ručiček (rot90).