Matlab - stručný úvod
Cvičení 1
Úvod | Generování dat | Základní operace | Grafický výstup | Podmínky a cykly | Import a export dat | Funkce | Další | Odkazy

kodovani ISO 8859-2
1. Úvod

Matlab je jazyk určený (především) pro numerické výpočty a vizualizaci jejich výsledků. Jeho jméno je zkratkou slov matrix laboratory. Z názvu je patrný základní datový typ. Je jím dvourozměrné pole (matice). Vektory jsou tak z hlediska Matlabu matice o rozměru (1,n) nebo (n,1) a skaláry jednoprvkové matice. Každá hodnota je vyjádřena pomocí 64 bitů. Poněvadž výsledky operací jsou automaticky komplexní, je dobré mít tuto skutečnost na zřeteli. Pro základní práci s komplexními čísly se používají funkce abs, real a imag.

Výhodou Matlabu je stručný zápis programu. Naopak, jeho nevýhodu představuje skutečnost, že příkazy vykonává jako interpreter. Z toho plyne poměrně malá rychlost při výkonu cyklů (projeví se především při zpracování větších objemů dat).

Interaktivní a dávkový režim
Základní prostředek pro komunikaci s programem je příkazová řádka. Po zadání je příkaz okamžitě proveden ("je to vlastně kalkulačka"). Zadán může být jak příkaz Matlabu, tak i jméno souboru (skriptu, dávky) obsahujího seznam příkazů. Soubor musí mít příponu .m (tzv. m-file).  Pokud na příkazové řádce postupně zadáme všechny řádky uvedené ve skriptu, je výsledek samozřejmě stejný. V obou režimech je možno zapisovat komentáře. Vše co je uvedeno za znakem procenta (%) je až do konce řádku bráno za komentář a nevykonává se. Toho lze pochopitelně využít pro potřeby ladění.

Nápověda
Pokud potřebujeme získat nápovědu ke konkrétní funkci, stačí zadat příkaz help jméno_funkce. Při zadání samotného příkazu help se vypíší všechny skupiny funkcí, které jsou k dispozici, help jméno_skupinyzobrazí seznam funkcí ve skupině. Pokud neznáme přesné jméno funkce, lze nápovědu vyhledat pomocí  lookfor a slov, popisujících danou problematiku. Např. když nás zajímají funkce provádějící zaokrouhlování, stačí vyhledat funkce se vztahem ke slovu round.
» lookfor round
CEIL   Round towards plus infinity.
FIX    Round towards zero.
FLOOR  Round towards minus infinity.
ROUND  Round towards nearest integer.
KNOT   Tube surrounding a three-dimensional knot.
LORENZ Plot the orbit around the Lorenz chaotic attractor.
WRLDTRV Show great circle flight routes around the globe.
WHITEBG Change axes background color.
 

obsah

2. Generování dat

Proměnné
V Matlabu může proměnná mít jméno až 31 znaků dlouhé. Prvním znakem musí být písmeno a rozlišují se velká a malá písmena. Hodnota se do proměnné přiřadí znakem rovnítka (=). Zadání ukončené středníkem potlačuje výpis hodnot na obrazovku. Pokud není výsledek posledního výpočtu přiřazen, je v systému uložen do zvláštní proměnné ans (answer). Pro výpis existujících proměnných stačí zadat příkaz who. Příkaz whos navíc vypíše i velikost proměnné. Velikost matice zjistí příkaz size, její délku length. Příkazem clear se proměnná smaže.
» a1 = 10;
» 2*a1

ans =

    20

» whos
  Name      Size         Bytes  Class

  a1        1x1              8  double array
  ans       1x1              8  double array

Grand total is 2 elements using 16 bytes
Vektory a matice se zadávají zápisem jejich prvků mezi hranaté závorky []. Prvky v matici se oddělují čárkou, řádky středníkem.
» a = [1,2,3]

a =

     1     2     3
» b = [1,2,3; 4,5,6; 7,8,9]

b =

     1     2     3
     4     5     6
     7     8     9
Transpozice se označuje znakem apostrofu ( ' ). V následujícím příkladě je z řádkového vektoru a vytvořen sloupcový vektor b.
» b = a'
b =

     1
     2
     3
Matice lze samozřejmě skládat z jiných matic. V následujících případech se různě kombinují základní vektory a, b.
» a = [1,2,3];
» b = [1,1,1];
» c = [a, b]

c =

     1     2     3     1     1     1

» d = [a; b]

d =

     1     2     3
     1     1     1

» e = [a', b']

e =

     1     1
     2     1
     3     1

» f = [a'; b']

f =

     1
     2
     3
     1
     1
     1
» g = [a, b']
???  All matrices on a row in the bracketed expression must have the 
 same number of rows.
Poslední případ ukazuje nesprávné skládání dvou vektorů (řádkový a sloupcový). Jde o jednu z nejčastějších chyb při práci z Matlabem.

Automatické generování dat
Pokud mají prvky vektoru tvořit aritmetickou řadu, lze toto zadat zkrácenou formou. Stačí uvést dolní a horní mez, případně krok. Pokud není uveden, je použita hodnota 1. Krok může být i záporný. (Ke stejnému účelu slouží i funkce linspace)
» x = 1:0.5:3

x =

    1.0000    1.5000    2.0000    2.5000    3.0000

» y = pi/2:-pi/4:-pi/4

y =

    1.5708    0.7854         0   -0.7854
Pokud mají být data uspořádána logaritmicky, stačí funkci logspace zadat mocniny 10 pro obě meze a počet prvků vektoru.
» z = logspace(1,2,5)

z =

   10.0000   17.7828   31.6228   56.2341  100.0000
Zvláštními případy jsou matice naplněné nulami nebo jedničkami.Pro tyto účely existují specializované funkce zeros a ones. Jako vstupní parametry se uvede počet řádků a sloupců.
» w = zeros(2,3)

w =

     0     0     0
     0     0     0

» q = ones(1,5)

q =

     1     1     1     1     1

Práce s částí matice, výběr submatic
Index požadovaných prvků se zapisuje do kulatých závorek. Obecný zápis je (vybírané řádky , vybírané sloupce). Pokud chceme vybrat celý řádek (sloupec), uvedeme místo rozsahu čísel dvojtečku.
» A = [1,2,3,4; 5,6,7,8; 9,10,11,12]

A =

     1     2     3     4
     5     6     7     8
     9    10    11    12

» B = A(2:3, 2:4)

B =

     6     7     8
    10    11    12

» C = A(3,4)

C =

    12

» D = A(1,:)

D =

     1     2     3     4

» E = A(:,3)

E =

     3
     7
    11
Zvláštní případ vybírání představuje zápis (:). Jeho výsledkem je vždy sloupcový vektor. Pokud se aplikuje na matici, jsou sloupce seřazeny za sebou do jediného dlouhého sloupce. Viz. příklad.
» A(:)

ans =

     1
     5
     9
     2
     6
    10
     3
     7
    11
     4
     8
    12
 

obsah

3. Základní operace   + - * / ^ .* ./ .^

Obecně lze sčítat,odčítat, násobit, dělit a umocňovat skaláry mezi sebou a sčítat,odčítat, násobit a dělit skalár s maticí. Při práci s maticemi je nutno dodržovat určité podmínky (např. pozor na rozměry matic při násobení !).
» A = [1,2; 3,4]

A =

     1     2
     3     4

» A+2

ans =

     3     4
     5     6

» A*2

ans =

     2     4
     6     8

» A/2

ans =

    0.5000    1.0000
    1.5000    2.0000

» A.^2

ans =

     1     4
     9    16

» 2./A

ans =

    2.0000    1.0000
    0.6667    0.5000
Matematické operace lze provádět dvojím způsobem: prvek po prvku (v tom případě je před znakem operace uvedena tečka, např. .* ./ .^ ), nebo maticově (* / ^). Pokud násobíme skalár a matici, lze tečky vynechat. Sčítání a odčítání, které se provádí vždy prvek po prvku, lze zapisovat obojím způsobem bez vlivu na výsledek. Rozdíl mezi oběma způsoby je dobře patrný na násobení matic.
» A = [1,2; 3,4]

A =

     1     2
     3     4

» A.*A

ans =

     1     4
     9    16

» A*A

ans =

     7    10
    15    22
 

obsah

4. Zobrazení výsledků

Pro zobrazení vektorů nebo matic existuje v Matlabu řada funkcí. Pro naše úvodní seznámení nám budou stačit jen dvě: plot a stem. Hlavní rozdíl mezi nimi je v tom, že stem kreslí hodnoty izolovaně, zatímco plot je spojuje lomenou čárou. Vykreslení vektoru je opravdu snadné:
» x = [-10:1:10];
» y = x.^2;
» plot(y);
Vektor je vynášen proti vodorovné ose, která je indexována 1 až n, kde n je délka vektoru. Obě funkce umožňují vynášet data proti jinému vektoru.
» plot(x,y);
Každé volání kreslicích funkcí způsobí překreslení starého obrázku. Často je ale potřeba zobrazit do jednoho obrázku více křivek. Potom je nutné ještě před kreslením druhého grafu Matlabu oznámit příkazem hold on, že chceme dosavadní zobrazení zachovat. Příkazy figure a close lze otevřít (zavřít) nové grafické okno.
Okno lze rozdělit na menší části pomocí subplot(počet řádků, počet sloupců, číslo okénka). S každou takto vytvořenou oblastí se pracuje stejně jako s běžným grafem. Např. rozdělení na čtyři menší části se provede takto:
 

subplot(2,2,1) subplot(2,2,2)
subplot(2,2,3) subplot(2,2,4)

U každého grafu lze popsat obě osy (xlabel, ylabel) a celý obrázek pojmenovat (title). Na závěr malý příklad shrnující předešlé řádky.
 

» x = -5:0.5:5;
» y = x.^2;
» z = x.^3;
» figure(1);
» subplot(1,2,1);
» plot(x,y);
» hold on;
» plot(x,z);
» xlabel('x');
» ylabel('y, z');
» title('Obrazek 1'); 
» subplot(1,2,2);
» plot(x);
» xlabel('n');
» ylabel('x');
» title('Obrazek 2');
Obr.1.:  Příklad použití příkazů hold on, figure a subplot
 
obsah

5. Podmínky a cykly

Matlab umožňuje používat klasické programovací konstrukce pro řízení průběhu výpočtu. Jsou to tyto konstrukce:

Podmíněný příkaz

if logický_výraz
    příkaz
      . . .
else
    příkaz
      . . .
end;
» x = 1;
» if (x > 0)
        disp('x je kladne.');
  else
        x = x + 1;
  end;
x je kladne.

Cyklus s pevným počtem opakování

for index = start:krok:konec      % Pokud není uveden krok, je nastaven na hodnotu 1
    příkaz
      . . .
end;
» for k = 1:5
        a(k) = k.^2;
  end;
» a

a =

     1     4     9    16    25

Cyklus s podmínkou na začátku

while výraz
    příkaz
      . . .
end;
» y = 10;
» while (y ~= 5)
        y = y-1;
  end;
» y

y =

     5

Dále je možno použít i příkaz switch pro realizaci přepínače (od verze 5). 

obsah

6. Import a export dat

Matlab má vlastní formát pro ukládání dat do binárního souboru typu *.mat. Pomocí příkazů save a load lze uložit všechny proměnné (tzv. pracovní prostor), případně jejich jen vybranou část. Pomocí přepínače -ascii lze zvolit uložení do textového souboru.

Pro uložení všech proměnných do souboru analyza1209.mat:
» save analyza1209
Načtení proměnných X1, q ze souboru bigblue.mat:
» load bigblue X1 q
Uložení proměnné A do textového souboru zaloha2.txt:
» save zaloha2.txt A -ascii
Při načítání textových souborů pozor ! Obsah souboru se načte do proměnné stejného jména. Navíc textově lze uložit jedinou proměnnou.
» load zaloha2.txt
» A = zaloha2;

Poznámky:

  • proměnné uvádět oddělené mezerou,
  • formát souboru *.mat  se pro starší verze Matlabu (4) liší, v novějších (5.1 a výše) lze ukládat i do staršího formátu (podrobnosti v helpu pro save).

  •  
    obsah

    7. Funkce

    K funkcím zabudovaným do Matlabu si můžeme přidat svoje vlastní. Funkce se na první pohled podobá skriptu. Na začátku souboru je ale uvedena hlavička funkce. Ta umožňuje předávání dat do a z  funkce. Vnitřek funkce je oddělen od pracovního prostoru a pokud jsou při jejím výkonu vytvořeny nové proměnné, tak neovlivňují okolí a po ukončení funkce opět zaniknou. Informace se předává vstupními (in) a výstupními parametry (out).

    Hlavička funkce má tvar
    function[out1, out2, ...] = jmeno_funkce(in1, in2, ...)

    Pokud za řádkem s hlavičkou následuje řádek s komentářem, je obsah komentáře zobrazen při volání funkce help jmeno_funkce. Máme tak možnost si podrobně okomentovat používání a účel naší nové funkce.

    Příklad jednoduché funkce, uložené v souboru tak_kolik.m:
     
    function [soucet, delka] = tak_kolik(x)
    % TAK_KOLIK je funkce ktera vraci soucet vsech prvku
    %       vstupniho vektoru a jeho delku.
    
    soucet = sum(x);
    delka = length(x);
     

    obsah

    8. Další užitečné funkce

    Zvukový výstup
    Funkce sound předá vstupní vektor do zvukového zařízení (je-li připojeno).
    » x = sin(2*pi*440*(1:1000)./8000);
    » sound(x);
    Zaokrouhlování
    Implementovány jsou funkce floor, round, ceil, fix realizující různé typy zaokrouhlovacích operací.

    Generování náhodného šumu
    Pro generování náhodných signálů lze použít funkce randn (normální rozdělení hustoty pravděpodobnosti) nebo rand (rovnoměrné rozdělení).

    Práce s polynomy
    Pro nalezení kořenů polynomu slouží funkce roots nebo naopak k jeho vytvoření funkce poly.

    Manipulace se soubory
    Příkazem cd lze změnit aktuální adresář (včetně disku), obsah adresáře vypíše dir a obsah souboru type. Pokud si nejsme jisti s polohou v adresářovém stromě, pwd vypíše aktuální adresář.
     

    obsah

    Odkazy
    Tento text vznikl jako podklad pro cvičení z předmětu UCZ na katedře teorie obvodů ČVUT. Poslední úprava 29.9.2001

    Petr Prášek: xprasek@feld.cvut.cz