Table of Contents

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
help 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 ]
% 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.
D = [ 1 2 3 ];
Matice s jedním rozměrem = 1 -> vektor.
% Zapis "WYSIWYG" (radkovy vektor)
a = [ 1 2 3 4 5 ]
% Carka oddeluje hodnoty v radku (radkovy vektor)
b = [ 10, -54, 123, 52, 8 ]
% Sloupcovy vektor
s1 = [ 1
2
3 ]
s2 = [ 1; 2; 3; 4; 5 ]
Skalár je matice rozměru 1x1.
% Skalarni hodnota
K = 54
Určení rozměru numerického pole - funkce size.
help 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 ]
% Odstraneni prvniho radku
A( 1, : ) = []
% Odstraneni druheho a tretiho sloupce
A( :, [2 3] ) = []

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
A(33) % vyber z pozice 33
A(48) % vyber z pozice 48
% Indexovani vektorem
A(1:25)
A(1:5:25)
A([5 10 45])
% Pouziti end
A(10:end)
A(end-10:end)
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 )
A( :, [1 3 20 25] )
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)
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.
% Textovy retezec
jmeno = 'Petr';
prijmeni = 'Pokorny';
zamestnavatel = 'CTU in Prague';
% Vypis retezce na terminal
disp( jmeno )
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

% 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(1:100)

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
D = A + B % soucet matic
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
E = A./B % a deleni
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
D = rand(3,3);
E = D' % pro matici realnych hodnot nema vliv (komplexni cast = 0)

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

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é:
  1. zapište proměnnou A rovnu 10,
  2. B rovnu 25 desetinám násobenou 23. mocninou deseti (využijte 1e+N),
  3. komplexní proměnnou C s reálnou částí 2 a imaginární 3,
  4. proměnnou D jako komplexní číslo v Eulerově formě zápisu s argumentem 2π/3.
Vektory:
  1. zapište řádkový vektor V1 o 20 prvcích lineárně dělených od −1 do 1 (linspace),
  2. řádkový vektor V2 a třech prvcích odpovídajících datu vašeho narození (ve formátu DD, MM, YYYY),
  3. sloupcový vektor V3 o šesti prvcích odpovídajících prvním šesti číslicím vašeho rodného čísla,
  4. vektor V4 obsahující Vaše křestní jméno.
Matice:
  1. zapište plnou matici M1 rozměru 10x10 o prvcích 5 (ones, zeros, …),
  2. diagonální matici M2 rozměru 5x5 s diagonálními prvky od 1 do 5 (diag, zeros, …),
  3. matici M3 náhodných reálných čísel rozměru 3x4 v rozmezí −5 do 5 (rand, …),
  4. matici M4 rozměru 5x5 hodnot NaN (nan, …),
  5. 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:
  1. Určete velikost matice M1 (size, …).
  2. Sečtěte po sloupcích matici M3. Výsledkem by měl být řádkový vektor (sum, …).
  3. Vypočtěte průměr z jednotlivých řádků matice M9. Výsledkem by měl být sloupcový vektor (mean, …).
  4. Nahraďte první řádek matice M1 jednotkovým vektorem (ones, size, …).
  5. Vypište prvky matice M3 v druhém sloupci od 2. řádku do konce (end, …).
  6. 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].
  7. 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, …).
  8. Vytvořte matici M10, která vznikne horizontálním spojením matic M2 a M4 (horzcat, …).
  9. Vytvořte matici M11, která vznikne vertikálním spojením matic M1 a M10 (vertcat, …).
  10. 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).