Úvod do MATLABu

Tento dokument popisuje naprosté základy práce s MATLABem. Opravdu se s MATLABem (stejně jako s čímkoli jiným) seznámíte tak, že s ním budete pracovat. Nekopírujte proto příkazy z této stránky, přepisujte je ručně a snažte se je pochopit.

Contents

Skaláry

Skalár je pro MATLAB matice velikosti 1x1:

s = 1
s =

     1

Jak jste si jistě všimli, došlo též k výpisu výsledku. Ten lze potlačit uvedením středníku na konci řádku:

s = 1;

Výpis obsahu proměnné lze provést i bez přiřazení:

s
s =

     1

K výpisu proměnných ovšem slouží i jiné možnosti, např.:

disp(s);
     1

Vektory

Vektory mohou být řádkové nebo sloupcové, pro MATLAB jsou to matice Dx1 nebo 1xD. Uzavírají se do hranatých závorek. Řádkový vektor:

vrow = [1 2 3]
vrow =

     1     2     3

Sloupcový vektor lze vytvářet pomocí ;, který ukončuje řádek matice:

vcol = [1; 2; 3]
vcol =

     1
     2
     3

Apostrof ' je operátor transpozice, takže sloupcový vektor lze zadat i takto:

vcol = [1 2 3]'
vcol =

     1
     2
     3

K i-tému prvku vektoru přistupujeme pomocí indexu v kulatých závorkách:

vrow(2)
ans =

     2

Počet prvků ve vektoru lze zjistit funkcí length.

length(vrow)
ans =

     3

Vektory: Vytváření pomocí operátoru :

Často je třeba vytvořit vektor s ekvidistantně vzdálenými prvky:

v1 = 1:10
v1 =

     1     2     3     4     5     6     7     8     9    10

Je možné určit i krok

v2 = 10:-2:1
v2 =

    10     8     6     4     2

Matice

Matice se zadávají stejně jako vektory. Vytvoříme matici 3x3:

M = [11 12 13; 21 22 23; 31 32 33]
M =

    11    12    13
    21    22    23
    31    32    33

Matice lze spojovat. Připojíme řádkový vektor:

M = [M; [41 42 43]]
M =

    11    12    13
    21    22    23
    31    32    33
    41    42    43

A připojíme sloupcový vektor

M = [M [14 24 34 44]']
M =

    11    12    13    14
    21    22    23    24
    31    32    33    34
    41    42    43    44

Podobně lze spojovat i matice s maticemi:

[M M]
[M; M]
[M M; M M]
ans =

    11    12    13    14    11    12    13    14
    21    22    23    24    21    22    23    24
    31    32    33    34    31    32    33    34
    41    42    43    44    41    42    43    44


ans =

    11    12    13    14
    21    22    23    24
    31    32    33    34
    41    42    43    44
    11    12    13    14
    21    22    23    24
    31    32    33    34
    41    42    43    44


ans =

    11    12    13    14    11    12    13    14
    21    22    23    24    21    22    23    24
    31    32    33    34    31    32    33    34
    41    42    43    44    41    42    43    44
    11    12    13    14    11    12    13    14
    21    22    23    24    21    22    23    24
    31    32    33    34    31    32    33    34
    41    42    43    44    41    42    43    44

Matice samozřejmě musí mít "kompatibilní" rozměry. Velikost matice lze zjistit funkcí size.

size([M M])
ans =

     4     8

Matice: Přístup k prvkům

Opět se indexuje pomocí kulatých závorek:

M(2,3)
ans =

    23

Lze indexovat i pomocí jednoho indexu. Porovnejte následující výsledky:

M(10)
M(2,3)
ans =

    23


ans =

    23

Z matice lze vybírat i podmatice:

M(1:2,[1 2 4])
ans =

    11    12    14
    21    22    24

Ujistěte se, že chápete, co bylo vybráno. Byly vybrány prvky z řádků 1 a 2 ležící ve sloupcích 1, 2 a 4.

Lze vybrat i celý řádek:

M(2,:)
ans =

    21    22    23    24

Nebo sloupec:

M(:,3)
ans =

    13
    23
    33
    43

Matici lze přetransformovat do podoby sloupcového vektoru:

M(:)
ans =

    11
    21
    31
    41
    12
    22
    32
    42
    13
    23
    33
    43
    14
    24
    34
    44

Matice: Přiřazení nových hodnot prvkům

Přiřazení jedinému prvku:

M(2,3) = -23
M =

    11    12    13    14
    21    22   -23    24
    31    32    33    34
    41    42    43    44

Přiřazení celému řádku:

M(1,:) = [1 2 3 4]
M =

     1     2     3     4
    21    22   -23    24
    31    32    33    34
    41    42    43    44

Přiřazení do podmatice:

M(1:2,[2 4]) = [-12 -14; -22 -24]
M =

     1   -12     3   -14
    21   -22   -23   -24
    31    32    33    34
    41    42    43    44

Výmaz posledního řádku:

M(end,:) = []
M =

     1   -12     3   -14
    21   -22   -23   -24
    31    32    33    34

Matice: Speciální druhy

Nulová matice:

M0 = zeros(2,3)
M0 =

     0     0     0
     0     0     0

Jedničková matice:

M1 = ones(2,3)
M1 =

     1     1     1
     1     1     1

Jednotková (diagonální) matice:

Md = eye(2,3)
Md =

     1     0     0
     0     1     0

Matice vyplněná náhodnými hodnotami s rovnoměrným rozdělením U(0,1):

Mru = rand(2,3)
Mru =

    0.6946    0.7948    0.5226
    0.6213    0.9568    0.8801

Matice vyplnění náhodnými hodnotami se standardním normálním rozdělením N(0,1):

Mrn = randn(2,3)
Mrn =

    1.4435    0.6232    0.9409
   -0.3510    0.7990   -0.9921

Matice: Operace

Maticové operace jsou doménou MATLABu. Sčítání:

Ma = [1 2; 3 4]; Mb = [11 12; 13 14];
Ma + Mb
ans =

    12    14
    16    18

Maticové násobení (zopakujte si, co to vlastně je!):

Ma * Mb
ans =

    37    40
    85    92

Násobení po prvcích:

Ma .* Mb
ans =

    11    24
    39    56

Inverze matice

inv(Ma)
inv(Ma)*Ma
ans =

   -2.0000    1.0000
    1.5000   -0.5000


ans =

    1.0000         0
    0.0000    1.0000

Maticová mocnina (srovnej s maticovým násobením):

Ma ^ 2
ans =

     7    10
    15    22

Mocnina prvků matice

Ma .^ 2
ans =

     1     4
     9    16

Dělení skalárem

Ma / 2
ans =

    0.5000    1.0000
    1.5000    2.0000

Dělení matic po prvcích

Mb ./ Ma
ans =

   11.0000    6.0000
    4.3333    3.5000

Vlastní čísla matice

eig(Ma)
ans =

   -0.3723
    5.3723

Matice: Řešení soustavy lineárních rovnic

Budeme chtít vyřešit soustavu

Definujme:

A = [1 2 3; -1 0 2; 1 3 1]; b = [1 0 0]';

Lze využít inverzní matici:

x = inv(A)*b
x =

    0.6667
   -0.3333
    0.3333

Lepší (přesnější) je použít operátor \, který soustavu řeší Gaussovou eliminací:

x = A\b
x =

    0.6667
   -0.3333
    0.3333

Kontrola správnosti výsledku:

A*x-b
ans =

  1.0e-015 *

         0
    0.1110
    0.0555

Logické operace

Výsledkem relačních operátorů jsou logické matice (obsahující jen 0 nebo 1):

a = 1:6; b = a>3
b =

     0     0     0     1     1     1

Podobně fungují další relační operátory <, >=, <=, ==, ~=.

Logické spojka or |:

b = (a>3) | (a==1)
b =

     1     0     0     1     1     1

Logická spojka and &:

b = (a>3) & (a~=5)
b =

     0     0     0     1     0     1

Indexy všech nenulových prvků v matici (vektoru):

ind = find(b)
ind =

     4     6

Programování

MATLAB obsahuje několik vestavěných příkazů a funkcí, ostatní jsou implementovány ve formě m-souborů. M-soubory mohou obsahovat definice funkcí nebo skripty. Skript je pouze dávka příkazů, výsledek je stejný, jako byste tyto příkazy zadali postupně na příkazovou řádku.

Programování: Funkce

Funkce se v MATLABu zapisují do separátních m-souborů (m-soubor se skriptem nemůže obsahovat definici funkce ze stejného důvodu, jako nelze psát definici funkce přímo na příkazovém řádku). Formát je jednoduchý:

type SlozitaFunkce
function [soucet,rozdil] = SlozitaFunkce(a,b)
%
% Tohle je help k funkci SlozitaFunkce. Vsechny komentarove radky
% (zacinajici znakem %) pod hlavickou fukce az do prvniho prazdneho radku
% se vypisi zadanim prikazu 'help SlozitaFunkce'.
%

    soucet = a+b;
    rozdil = a-b;

end % Nepovinne
[s,r] = SlozitaFunkce(8,3)
s =

    11


r =

     5

help SlozitaFunkce
 
  Tohle je help k funkci SlozitaFunkce. Vsechny komentarove radky
  (zacinajici znakem %) pod hlavickou fukce az do prvniho prazdneho radku
  se vypisi zadanim prikazu 'help SlozitaFunkce'.
 

Funkce return okamžitě ukončuje funkci v místě svého volání a předává řízení volající funkci.

Programování: If-else, switch-case

Větvení běhu programu lze provádět pomocí příkazu if:

if s > 11
    disp('Soucet je vetsi nez 11.');
elseif r < 5,
    disp('Soucet neni vetsi nez 11 a rozdil je mensi nez 5.')
else
    disp('Soucet neni vetsi nez 11 a rozdil neni mensi nez 5.');
end
Soucet neni vetsi nez 11 a rozdil neni mensi nez 5.

Jinou formu větvení lze provést příkazem switch:

switch r
    case {0, 1, 2, 3}
        disp('Rozdil je v intervalu 0-3.');
    case 4
        disp('Rozdil je 4.');
    case {5, 6, 7}
        disp('Rozdil je v intervalu 5-7.')
    otherwise
        disp('Rozdil uplne jiny.')
end
Rozdil je v intervalu 5-7.

Programování: Cykly

Mnohé cykly se v MATLABU dají nahradit vektorovými operacemi. Kde je to možné používejte vektorové operace -- jsou mnohem efektivnější než cykly.

Programování: Cyklus for

V MATLABU existuje v podstatě pouze for-cyklus typu foreach, ale velice snadno se pomocí něj realizuje klasický cyklus for:

for i = 1:10
    fprintf('%d  ',i);
end
1  2  3  4  5  6  7  8  9  10  
for i = [1 6 10000]
    fprintf('%d  ',i);
end
1  6  10000  

Programování: Cyklus while

Cyklus while má obvyklou formu:

i = 1;
while i < 10
    fprintf('%d  ',i);
    i = i+1;
end
1  2  3  4  5  6  7  8  9  

Programování: break a continue v cyklech

Příkaz break ukončuje aktuální cyklus.

i = 0;
while 1
    i = i+1;
    if i == 5, break, end
    fprintf('%d  ',i);
end
fprintf('Za cyklem.');
1  2  3  4  Za cyklem.

Příkaz continue přeskakuje zbytek iterace a přechází na další:

i = 0;
while i < 10
    i = i+1;
    if i == 5, continue, end
    fprintf('%d  ',i);
end
1  2  3  4  6  7  8  9  10  

2D grafy

MATLAB disponuje velkým množstvím funkcí pro tvorbu grafů. Tou zdaleka nejčastěji používanou je funkce plot.

x = [0:0.05:1] * 2*pi;
ysin = sin(x);
plot(x,ysin);

Nastavení barvy (r), bodů (o) a vzoru čáry(--). Graf se vynese do stejného obrázku místo toho minulého:

plot(x,ysin,'ro--');

Vynesení jiné funkce do stejného grafu

hold on; % Podrzime obrazek, aby se graf pridal
ycos = cos(x);
plot(x,ycos,'mx:');

Budete-li chtít využít logaritmické měřítko na některé z os, využijte funkce semilogx nebo semlogy, logaritmické měřítko na obou osách zajistí funkce loglog.

close all; % Zavreme vsechny otevrene grafy
x = 1:10;
y = exp(-x);
plot(x,y);
semilogy(x,y);

Chcete-li umístit několik grafů do jednoho, využijte funkci subplot. Volání subplot(2,1,1) říká, že chceme vytvořit matici grafů o 2 řádcích a 1 sloupci a vykreslovat budeme do 1. z nich.

subplot(2,1,1);
plot(x,y);
subplot(2,1,2);
semilogy(x,y);

Různé

help, doc - nápověda a dokumentace k jednotlivým funkcím a příkazům

who (whos) - výpis proměnných v pracovním prostoru (spolus dalšími informacemi)

which - kde je uložen daný m-soubor

edit - otevře m-file v editoru

Co byste měli ještě určitě znát

Podívejte se na následující funkce a příkazy a pochopte je.

path, addpath

format, disp, fprintf, sprintf, load, save

inf, nan, any, all, isempty, round, ceil, floor, ops

min, max, sort, sum, mean, std

axis, title, xlabel, ylabel, legend, plot3, contour, print