M-súbory slúžia na ukladanie postupností príkazov (skripty) alebo na ukladanie užívateľských funkcií (funkcie). Tieto nové súbory majú príponu .m.
Poznámka: m-súbory sú obyčajné textové súbory (ASCII súbory), a preto je možné ich písať aj v ľubovoľnom textovom editore. Z dôvodov vyššieho komfortu (zvýraznenie syntaxe, možnosť krokovania) je súčasťou MATLABu tiež M-editor/Debugger, ktorý sa otvára v samostatnom okne po otvorení alebo vytvorení m-súboru (skriptu či funkcie).
Od verzie 5.0 je súčasťou MATLABu aj vlastný editor, ktorý zároveň slúži ako debugger. Ide o jednoduchý editor, ktorý má niektoré užitočné vlastnosti:
M-editor/Debugger je spustený v samostatnom okne po otvorení (File » Open) alebo vytvorení (File » New » M-file) nového m-súboru. Slúži k pohodlnej editácii m-súboru. Navyše umožňuje krokovať obsah m-súboru (t.j. kontrolovať vykonávanie jeho jednotlivých príkazov).
Skript (z angl. script) je postupnosť príkazov uložených do súboru. Každý skript pracuje s premennými pracovného prostredia, takže môže vytvárať nové alebo mazať či meniť vybrané. Výsledky skriptu teda zostávajú v pracovnom prostredí aj po jeho skončení. Skripty samozrejme môžu volať iné skripty alebo funkcie, vytvárať grafické okná, vypisovať do Command Window, ...
Spustenie skriptu dáva MATLABu pokyn k vykonaniu jeho príkazov. Pred spustením musí byť skript uložený! Skript môže byť spustený buď
% GRAF - vykreslenie paraboly x = -3:0.1:3; % vektor hodnôt z intervalu [-3;3] s krokom 0,1 y = x.^2; % závislá premenná plot(x,y) % graf (parabola)
>> parabola
Pokiaľ je všetko v poriadku, objaví sa okno s grafom. V opačnom prípade musí byť nájdená a opravená chyba, uložený súbor a jeho opätovné spustenie.
Ak sa nejaká postupnosť príkazov (algoritmus) opakuje vo viacerých situáciách (napr. pre rôzne hodnoty premenných), nie je praktické používať skripty, pretože vždy sa musia upraviť hodnoty premenných v skripte, uložiť príslušný m-súbor a skript spustiť. Riešenie ponúkajú funkcie.
Funkcie sú m-súbory, ktoré majú presne definovanú štruktúru (viď. Vytvorenie funkcie). Funkcie akceptujú vstupné parametre, ktoré môžu mať pri každom spustení inú hodnotu.
Každá funkcia má svoje vlastné pracovné prostredie, ktoré je oddelené od pracovného prostredia Command Window. Všetky premenné vo funkcii sú lokálne (existujú iba vnútri funkcie). To znamená, že:
Našťastie existuje spôsob, ktorým funkcia môže svoje výsledky predať "von": výstupné premenné. Počet vstupných aj výstupných parametrov funkcie sa určuje pri jej vytváraní. Pokiaľ funkcia nemá žiadne vstupné parametre, môžu sa jej príkazy napísať tiež ako skript.
function y = priemer(x) % PRIEMER stredna hodnota vektora. % PRIEMER(X), kde X je vektor vrati strednu hodnotu elementov vektora % Ak vstup nie je vektor, vrati chybu. [m,n] = size(x); if (~((m == 1) | (n == 1)) | (m == 1 & n == 1)) error('Vstup musi byt vektor') end y = sum(x)/length(x); % Vypočet
function | [výstupy]= | názov_funkcie | (vstupy) |
---|---|---|---|
kľúčové slovo | výstupy funkcie | názov funkcie | vstupné parametre funkcie |
výstupy:
názov_funkcie:
vstupy:
function [s]=sucet(a,b) % funkcia s jedným výstupom a dvoma vstupmi function [podiel,zvysok] = delenie(delenec,delitel) % funkcia s dvoma vstupmi a výstupmi function f = faktorial(n) % funkcia s jedným výstupom a vstupom function graf(x,y) % funkcia bez výstupu a dvoma vstupmi
Prvý riadok nápovedy by mal obsahovať názov funkcie a vystihovať jej činnosť, pretože je
vypisovaný príkazom lookfor slovo (slúží na výpis všetkých funkcií obsahujúcich dané
slovo) alebo pri výpise nápovedy k funkciám adresára help adresár
(napríklad help C:\temp\matlab).
Ďalšie riadky nápovedy by mali obsahovať opis vstupu a výstupu funkcie a tiež príklad jej použitia.
Poznámka: na výpis chyby a ukončenie funkcie možno použiť funkciu error, jej parametrom je text chybového hlásenia (napr. error('Chyba: veľa vstupných parametrov!')). Okrem vytvorenia nápovedy k funkcii je vhodné používať tiež komentáre v kóde funkcie (pri jednotlivých príkazoch).
function [s] = sucet(a,b)
% SUCET - sucet dvoch cisiel
% s=sucet(a,b)
% a,b ... scitance
% s ... vysledok (sucet)
% priklad volania: s=sucet(10,-2.5)
s = a+b;
function [prep] = prepona(odvesna1,odvesna2) % PREPONA - vypočet prepony pravouhleho trojuholnika prep = (odvesna1^2 + odvesna2^2)^(1/2); % pouzitie Pythagorovej vety
Funkcie (aj vlastné) môžeme spustiť z Command Window (alebo z iných funkcií či skriptov).
Príkaz na spustenie funkcie vypadá obecne takto:
>> [vystupy] = nazov_funkcie(vstupy) % pokiaľ je potrebné uložiť výsledky do premenných >> nazov_funkcie(vstupy) % pokiaľ sa výsledky neukladajú do premenných
>> s = sucet(7,14); >> vysledok = sucet(7,14) vysledok = 21 >> x=7; y=14; sucet(x,y) ans = 21
Kód funkcie (t.j. obsah m-súboru) je možné (okrem M-editora/Debuggera) zobraziť v Command Window príkazom type názov_funkcie, kde názov_funkcie je názov funkcie (názov m-súboru bez prípony).
Pokiaľ sú vo funkcii chyby (napr. nedáva správne výsledky) a nie je možné ich príčinu nájsť jednoduchým prečítaním jej kódu, potom sa používa Debugger, ktorý ponúka možnosť krokovania:
Funkcia | Opis |
---|---|
eval | vykoná reťazec z MATLABového príkazu |
feval | vykoná funkciu so špecifikovaným menom |
function | pridanie novej funkcie |
global | definovanie globálnej premennej |
nargin | počet zadaných vstupných parametrov |
nargout | počet požadovaných výstupných parametrov |
Pomocou funkcie eval umožňuje MATLAB vykonávanie výrazu prostredníctvom reťazca. Vykonávanie funkcií pomocou reťazca umožňuje funkcia feval.
% Vykonanie výrazu pomocou definovaných premenných >> a = 2; b = 1; >> c = '1/(a+b+7)'; >> eval(c) ans = 0.1000 % Vytvorenie premenných x1, x2, ..., x5 a priradenie druhých mocnín >> for i=1:5 eval(['x',int2str(i),'=i.^2']) end x1 = 1 x2 = 4 x3 = 9 x4 = 16 x5 = 25 % Možnosť vykonávania rôznych funkcií >> fun = ['sin';'cos';'log']; >> k = 1; x = 2; >> feval(fun(k,:),x) % = sin(x) ans = 0.9093
Pokiaľ je potrebné, aby "vlastná" funkcia reagovala na rôzny počet vstupných parametrov, môže byť v jej kóde použitá funkcia nargin. Funkcia nargin nemá žiadne vstupy, ale vracia skutočný počet parametrov, s ktorými bola funkcia spustená. Pokiaľ je zavolaná "vlastná" funkcia s menším počtom vstupných argumentov, môže sa spracovať inak ako v prípade plného počtu vstupov.
Poznámka: poradie vstupných parametrov v definícii funkcie je zaväzujúce (napr. ak je vynechaný druhý zo štyroch vstupov, funkcia to pochopí tak, že vynechal ten štvrtý!).
Na zistenie skutočného počtu výstupných parametrov je funkcia nargout. Pracuje sa s ňou podobne ako s funkciou nargin.
function [x,y] = kontrola(a,b,c,d) disp(sprintf('počet zadanych vstupnych argumentov: %d',nargin)); disp(sprintf('počet vyzadovanych vystupnych argumentov: %d',nargout)); x = 2; y = 3;
>> [x,y] = kontrola(1,2); počet zadanych vstupnych argumentov: 2 počet vystupnych argumentov: 2
>> [x] = kontrola(1); počet zadanych vstupnych argumentov: 1 počet vystupnych argumentov: 1
>> kontrola(1); počet zadanych vstupnych argumentov: 1 počet vystupnych argumentov: 0
function [s] = sucet(a,b) % SUCET - sucet dvoch cisiel % s=sucet(a,b) % a,b ... scitance % s ... vysledok (sucet) % priklad volania: s=sucet(10,-2.5) if nargin~=2 % nespravny počet vstupov? error('CHYBA: na vypočet su potrebne DVA vstupy!') % vypis chyby a koniec funkcie end % koniec if s = a+b; % vypočet vysledku
Príkaz | Opis |
---|---|
break | ukončenie vykonávajúceho sa cyklu |
else | súvisiace s if |
elseif | súvisiace s if |
end | ukončenie rozsahu príkazov for, while, switch a if |
error | zobrazenie správy a ukončenie funkcie |
for | opakované vykonávanie príkazov so špecifikovaným číslom |
if | podmienené vykonávanie príkazov |
switch | podmienené vetvenie príkazov |
return | návrat do volajúcej funkcie |
while | podmienené opakovanie vykonávania príkazov |
Občas potrebujeme, aby sa určité príkazy vykonali iba v prípade, ak je splnená nejaká podmienka. V MATLABe je k dispozíci príkaz if, ktorý umožnuje vyhodnotiť (otestovať) podmienku, a podľa jej pravdivosti potom vykoná (nebo nevykoná) zadanú množinu príkazov. Jeho základná syntax je:
if podmienka príkazy end
Príkaz začína kľúčovým slovom if, za nim následuje podmienka (ľubovoľný výraz s logickou hodnotou 0 alebo 1 (väčšinou sa v podmienkach používajú relačné alebo binárne logické operátory). Vnutri príkazu if sú akékoľvek príkazy, ktoré sa majú vykonať v prípade splnenia podmienky. Pretože príkazov vnútri if môže byť viac, tak za posledným z nich musíme uviesť kľúčové slovo end, ktoré označuje koniec celého príkazu.
Poznámky:
>> znamka = 3; >> if znamka == 1 zobraz = 'Gratulujeme! Lepsie to byt nemohlo!' end
Poznámka:
>> znamka = 1; if znamka == 1; zobraz = 'Gratulujeme! Lepsie to byt nemohlo!', end zobraz = Gratulujeme! Lepsie to byt nemohlo!
if a < 5 disp('hodnota premennej ''a'' je mensia ako cislo 5') end
>> a = 3; >> priklad hodnota premennej 'a' je mensia ako cislo 5V prípade, že potrebujeme vykonať nejaké príkazy v prípade platnosti podmienky, ale iné príkazy v prípade jej neplatnosti, môžeme použiť vetvu else:
if podmienka príkazy1 else príkazy2 end
Činnosť príkazu if-else: najskôr sa testuje podmienka. Ak je pravdivá, vykonajú sa príkazy1, ak je nepravdivá, vykonajú sa príkazy2. Vždy sa teda vykoní jedna skupina príkazov.
if a < 5 disp('hodnota premennej ''a'' je mensia ako cislo 5') else disp('hodnota premennej ''a'' je vacsia alebo rovnaká ako cislo 5') end
>> a = 9; >> priklad1 hodnota premennej 'a' je vacsia alebo rovnaká ako cislo 5
Z predchádzajúceho príkladu je vidieť, že niekedy može byť vhodné v prípade neplatnosti podmienky testovat tiež iné možnosti. Na splnenie tohto cieľa stačí vnoriť ďalší príkaz if do vetvy else. Existuje aj pohodlnejší prostriedok ako vnorenie - rozšírená syntax príkazu if:
if podmienka1 príkazy1 elseif podmienka2 príkazy2 else príkazy3 end
Poznámka:
Včeobecná činnosť príkazu if: najskôr sa testuje pravdivosť podmienky1. Pokiaľ platí, vykonajú sa príkazy1 a ostatné vetvy príkazu sú ignorované. Pokiaľ podmienka1 neplatila, začne sa testovať podmienka2. Ak platí, vykonajú sa príkazy2 a zvyšok vetvy je ignorovaná. Ak neplatí, pokračuje sa ďalšej vetve elseif (ak ešte nejaká je) ... V prípade, že ani jedna z podmienok neplatila, sú vykonané príkazy vo vetve else (ak je definovaná).
function text = vetvenie1(x) n = length(x); if n == 0 error('Vektor je prázdny'); elseif n < 3 text = 'Vektor má 1 alebo 2 prvky'; elseif n >= 3 & n < 5 text = 'Vektor má 3 alebo 4 prvky'; else text = 'Vektor má viac ako 4 prvky'; end
>> a = 1; >> b = vetvenie1(a) b = Vektor má 1 alebo 2 prvky >> a = [1 2 3]; >> disp(vetvenie1(a)) Vektor má 3 alebo 4 prvky >> a = [1 2 3 4 5 6]; >> vetvenie1(a) ans = Vektor má viac ako 4 prvky
Príkaz vetvenia switch má takmer rovnaký význam ako if, ale môže niekedy zjednodušiť skript. Vďaka tomuto príkazu sa dajú nahradiť dlhé príkazy if. Vetva skriptu je daná hodnotou jedného výrazu. Príkazy za otherwise sa vykonajú, pokiaľ výraz neodpovedá žiadnej podmienke.
switch výraz case podmienka1, príkazy1 case podmienka2, príkazy2 ... case podmienkaN, príkazyN otherwise, príkazy end
Pokiaľ je výraz == podmienka1 pravdivý, potom sa vykonajú príkazy1 a ostatné vetvy príkazu sú ignorované. Pokiaľ podmienka1 neplatila, začne sa testovať výraz == podmienka2. Ak platí, vykonajú sa príkazy2 a zvyšok vetvy je ignorovaná. Ak neplatí, pokračuje sa ďalšej vetve case (ak ešte nejaká je) ... V prípade, že ani jedna z podmienok neplatila, sú vykonané príkazy vo vetve otherwise (ak je definovaná).
function text = vetvenie2(x) n = length(x); switch n case 0 error('Vektor je prázdny'); case {1,2} text = 'Vektor má 1 alebo 2 prvky'; case {3,4} text = 'Vektor má 3 alebo 4 prvky'; otherwise text = 'Vektor má viac ako 4 prvky'; end
>> a = 1; >> b = vetvenie2(a) b = Vektor má 1 alebo 2 prvky >> a = [1 2 3]; >> disp(vetvenie2(a)) Vektor má 3 alebo 4 prvky >> a = [1 2 3 4 5 6]; >> vetvenie2(a) ans = Vektor má viac ako 4 prvky
Cyklus slúži na zápis príkazov, ktoré majú byť vykonávané opakovane (nekoľkokrát za sebou). Počet opakovaní týchto príkazov závisí od nejakej podmienky alebo môže byť dopredu známy. Preto existujú dva základne typy cyklov:
Príkazy vnútri cyklu sa nazývajú telo cyklu.
Cyklus riadený podmienkou používame, pokiaľ chceme niekoľkokrát vykonať určité príkazy, ale dopredu nepoznáme počet opakovaní, ale poznáme podmienky, za ktorých sa príkazy vykonávať majú. Táto podmienka sa nazýva riadiaca podmienka cyklu. V MATLABe je tento druh cyklov realizovaný príkazom while.
Cyklus while začína kľúčovým slovom while a končí kľúčovým slovom end:
while podmienka príkazy end
Poznámky:
Činnosť cyklu je možné vyjadriť vetou: Pokiaľ platí podmienka, vykonávaj príkazy.
Na začiatku sa testuje platnosť riadiacej podmienky. Pokiaľ podmienka platí (t.j. výraz má nenulovú hodnotu), vykonajú sa všetky príkazy tela cyklu. Potom sa opäť testuje podmienka a pokiaľ platí, vykonajú sa opäť všetky príkazy tela cyklu atď., pokiaľ sa pri testovaní podmienky nezistí, že podmienka neplatí (t.j. hodnota výrazu je nulová). Vtedy cyklus skončí, t.j. pokračuje sa vykonávaním príkazu za jeho koncom (ktorý je označený kľúčovým slovom end), pokiaľ tam nejaké sú.
Koniec cyklu môže nastať už pri prvom teste podmienky (ak je nulová), takže sa môže stať, že príkazy v tele cyklu sa nevykonajú ani raz.
Pretože sa podmienka testuje opakovane a závisí na ej ukončenie cyklu, mali by sa dodržiavať následujúce doporučenia: riadiaca podmienka cyklu by mala byť ovplivňovaná vykonávaním príkazov v tele cyklu tak, aby raz prestala platiť. Inak cyklus nikdy neskončí (nekonečný cyklus). Pokiaľ chceme ukončiť vykonávanie nekonečného cyklu, stlačíme CTRL+C.
while 1 % podmienka je vždy pravdivá, má stále hodnotu 1
disp('opakujem...')
end
function f = fakt1(n)
% FAKT1 - vypočet faktorialu celeho cisla
% f = fakt1(n)
% n ... cislo
% f ... faktorial (f=n!)
if n<0
error('faktorial neexistuje')
end
f = 1;
while n>1
f = f*n;
n = n-1;
end
>> f = fakt1(5)
f =
120.00
>> fakt1(0)
ans =
1.00
>> f = fakt1(-5)
??? Error using ==> fakt1
faktorial neexistuje
Tento cyklus používame, keď dopredu vieme, koľkokrát sa majú vykonať určité príkazy. Počet opakovaní je väčšinou daný vektorom, z ktorého si v každej iterácii (t.j. pri každom prechode cyklom) vezmeme jednu hodnotu - hodnota je uložená v tzv. riadiacej premennej cyklu. V MATLABe je tento druh cyklu realizovaný príkazom for.
Cyklus for začína kľúčovým slovom for a končí kľúčovým slovom end:
for premenná = výraz príkazy end
Poznámky:
Činnosť cyklu je možné vyjadriť vetou: n-krát vykonať príkazy (n je dĺžka výrazu, t.j.
počet prvkov vektora alebo počet stĺpcov matice).
Na začiatku sa zistí dĺžka (n) výrazu a pokiaľ je nenulová, n-krát sa vykoná telo cyklu
(príkazy). V každej iterácii je riadiaca premenná cyklu rovná jednému prvku vektora (začína sa
prvým prvkom a pokračuje sa po rade). Po vyčerpaní všetkých hodnôt vektora cyklus skončí, tzn.
pokračuje sa vykonávaním príkazu za jeho koncom (ktorý je označený kľúčovým slovom end),
pokiaľ tam nejaké sú.
Koniec cyklu môže nastať predčasne, pokiaľ je v tele cyklu obsiahnutý príkaz break alebo return.
k = 1; for i=1:5 k = k*i; sprintf('%d! = %d',i,k) end
>> fakt2 ans = 1! = 1 ans = 2! = 2 ans = 3! = 6 ans = 4! = 24 ans = 5! = 120
n = 3; % Pocet stlpcov m = 2; % Pocet riadkov for i=1:m for j=1:n A(i,j) = i*j end end
>> matica A = 1.00 A = 1.00 2.00 A = 1.00 2.00 2.00 0 A = 1.00 2.00 2.00 4.00 A = 1.00 2.00 2.00 4.00 3.00 0 A = 1.00 2.00 2.00 4.00 3.00 6.00
Príkaz | Opis |
---|---|
input | žiadosť o vstup z klávesnice |
keyboard | funkcia preruší chod programu pre príkazy z príkazového riadku |
menu | funkcia umožňujúca výber cez menu, ktorá vracia poradie vybranej položky |
pause | čakanie na stlačenie klávesy |
>> dlzka = input('Zadaj velkost vektora: ') Zadaj velkost vektora: 4 dlzka = 4
disp('Zaciatok') keyboard disp('Koniec')
>> klavesnica Zaciatok K>> c = 1 c = 1.00 K>> b = 2 b = 2.00 K>> return Koniec >>
k = menu('Vyber krivky','Priamka','Parabola','Exponenciala')
k = 2.00