MATrixLABoratory letný semester 2004/2005
Zaklady programovania v MatLabe 1. Riadenie toku premenných Príkazy v Matlabe na kontrolu toku programu fungujú veľmi podobne ako v iných programovacích jazykoch.
1. Príkaz for Syntax príkazu for je nasledovná: for i=pole príkazy end Príklad. Predstavte si, že potrebujete vypísať hodnoty funkcie sínus v bodoch n/10 pre n = 0; 1; ... 10. Vygenerujte tieto hodnoty použitím príkazu for. Riešenie. for n=0:10 x(n+1)=sin(pi*n/10); end Príkaz for by ste mali používať len ak neexistuje iná možnosť. Porovnajte nasledujúce dve verzie riešenia toho istého problému. Príklad. Vygenerujte maticu A rozmerov 10 x10, ktorej prvky sú akl = sin(k)cos(l). Porovnajte: Prvá možnosť
Druhá možnosť
for k=1:10
k=1:10;
for l=1:10
A(k,l)=sin(k)*cos(l);
A=sin(k)'*cos(k); end end
2. Príkaz while Syntax príkazu while: while výraz príkazy end Príkaz while používame zväčša vtedy, ak nie je vopred známy počet opakovaní tela cyklu. Príkazy v tele cyklu sa vykonávajú pokiaľ je daný výraz pravdivý.
MATrixLABoratory letný semester 2004/2005 3. Príkaz ifelseend Matlab umožňuje robiť na základe podmienok vetvenie programu. Na vetvenie Matlab ponúka tradičné príkazy, podobné ako v iných programovacích jazykoch. Syntax príkazu ifelseend: if výraz príkazy else príkazy end Ak je potrebné rozlíšiť viacero alternatív, mali by ste použiť nasledujúcu konštrukciu: if výraz 1 príkazy(vyhodnotia sa, ak je výraz 1 pravdivý) elseif výraz 2 príkazy (vyhodnotia sa, ak je výraz 1 pravdivý) ... else príkazy(vyhodnotia sa, ak je sú všetky predchádzajúce výrazy nepravdivé) end
4. Príkaz switchcase Ak je potrebné rozlíšiť veľa alternatívných možností pre hodnotu danej premennej, je vhodné namiesto príkazu if použiť príkaz switch. Syntax konštruktora switchcase: switch výraz (skalár alebo string) case hodnota1 príkazy (vyhodnotia sa, ak sa výraz vyhodnotí na hodnotu 1) case hodnota2 príkazy (vyhodnotia sa, ak sa výraz vyhodnotí na hodnotu 2) ... otherwise príkazy end Ak je potrebné rozlíšiť viac ako jednu hodnotu v danej alternatíve použijeme krútené zátvorky {}. Modelový príklad. Prirďťte premennej a ľubovoľnú hodnotu a otestujete funkčnosť nasledujúcej konštrukcie: switch a case 0 disp('a=0') case {1,2,3,4} disp('a is less than 5') case 10 disp('a is 10') otherwise disp('a is out of range') end
MATrixLABoratory letný semester 2004/2005 5. Príkaz break Break je užitočný príkaz, ktorý nám umožňuje predčasne ukončiť vykonávanie tela cyklu. Väčšinou sa používa v rámci príkazu if. Modelový príklad. V tomto prípade sa ukončí vykonávanie príkazu while, ak hodnota a bude menšia ako 5.
a=10; while a>2 a=a/2; if a<5 break; end end
2. msúbory Zvyčajne, ak opakujete nejakú analýzu znova a znova, nechcete stále vypisova» tie isté príkazy. Namiesto toho si radšej uložíte postupnosť príkazov do súboru, ktorý sa môže vyvolať v ľubovoľný čas. V Matlabe príkazy, uložené do súborov, sú presne tie isté, ktoré by ste písali do Command Line. Nasledujúce dve konvencie musia byť dodržané pri vytváraní Matlabovských súborov: 1. Názov súboru nemôže obsahovať medzeru, bodku ani pomlčku 2. Prípona Matlabovského súboru je *.m Matlabovským súborom, ktoré obsahujú počítačový kód, sa preto hovorí aj msúbory. Súbory, s ktorými chceme pracovať a vyvolávať ich, musia byť uložené vo vašom Current Directory. Exitujú dva typy msúborov: súbor so skriptom a súbor s funkciou. Script m.file Function m.file Nezadávajú sa vstupné argumenty a ani nevypisuje Môže obsahovť vstupné a vracať výstupné premenné výstupné Pracuje s premnnými vo Work space
Vnútorné premenné sú lokálne pre funkciu
Vhodné pre automatizáciu volania tých istých príkazov Vhodné pre rozšírenie funkčnej základne matlabovských viac krát
aplikácií
3. Čo je obsahom m.filu Ukážeme si základné časti, ktoré by mal obsahovať m.file. Môžete si ho prispôsobovať svojim vlastným predstavám. Začnime príkladom function f = fact(n) % Definícia funkcie % FACT Factorial. % H1 % FACT(N) vracia hodnotu faktorálu N % Help text % zvyčajne sa označuje N! % zadajte, FACT(N) je PROD(1:N).
MATrixLABoratory letný semester 2004/2005 f = prod(1:n); % Telo funkcie Táto funkcie obsahuje elementy, ktoré sú bežné pre všetky Matlabovské funkcie: • Definícia funkcie.Táto časť definuje meno funkcie a počet vstupných a výstupných argumentov. • H1. H1 znamená “help 1” . MATLAB zobrazuje H1 riadok funkcie ak použijete volanie lookfor alebo help pre celý adresár. •Help text. MATLAB zobrazuje help text súčasne s H1 riadkom ak zavoláte help pre túto. •Telo funkcie. Táto časť funkcie obsahuje kód pre výpočet a priraďuje hodnoty výstupným argumentom. m.file môžete otvoriť v menu pomocou New a potom výberom m.file, alebo pomocou volania >>edit foo Pričom menonemusí byť špecifikované hneď.
4. Skripty Skripty sú najjednoduchšie m.fily pretože nepotrebujú žiadene vstupné ani výstupné argumenty. Sú vhodné pre automatizá ciu matlabu, pre opakované zadávanie príkazov v Command Window. Skripty pracujú s premennými ktoré sú definované vo Workspace, alebo môžu vytvárať aj vlastne premenné, ktoré však takisto ostávajú vo Workspace. Takže potom čo je volanie skriptu ukončené môžete znova pracovať s tými istými premnnými. D:\My Documents\PupikTupik\FMFI UK PhD\MATLAB\Matlab\pokusy\KAPIT5.M
5. Funkcie Funkcie sú mfily, ktoré obsahujú vstupné aj výstupné premenné. Pracujú s premennými len v rámci ich vlastného pracovného priestoru. Tento je odlišný od Workspace v Matlabe. V ďalšom si predstavíme nasledovné: •“Jednoduchý príklad” •“Základné časti funkcií” •“Ako pracujú” •“Počet premenných” Každý msúbor obsahuje zvyčajne jednu funkciu. Prvý riadok súboru s funkciou musí mať nasledovnú štruktúru: function [zoznam vystupnych parametrov] = meno funkcie(zoznam vstupnych parameterov) Prvé slovo musí byť vždy function. Za ním nasledujú výstupné parametre, ohraničené v hranatých zátvorkách. Výstupné parametre nie sú povinné. Ak funkcia nevracia žiadne výstupné parametre, hranaté zátvorky aj znak “rovná sa“ sa vynechávajú. Meno funkcie je reťazec znakov. Toto meno sa použije na zavolanie funkcie. Meno funkcie musí byť také isté ako je meno msúboru, v ktorom je funkcia uložená (až na príponu m). Teda funkcia “pocitaj“ musí byť uložená v súbore „pocitaj.m“. Na koniec nasleduje zoznam vstupných parametrov(v okrúhlych zátvorkách), ktorý je tiež dobrovoľný.
6. •
Vstupné a výstupné parametre
Zoznam vstupných parametrov a zoznam výstupných parametrov pozostáva zo zoznamu čiarkou oddelených parametrov. Odporúča sa, aby sa s vstupnými parametrami funkcií nemanipulovalo. Nie je to zakázané, len sa odporúča, aby vstupné parametre boli považované za konštanty.
MATrixLABoratory letný semester 2004/2005 Vstupnými a výstupnými parametrami môžu byť ako skaláre, vektory, matice tak aj reťazce. Matlab v podstate nerozlišuje medzi typmi premenných, pokiaľ sa na nich nevykonáva nejaká operácia. Je prípustné, aby vstupným parametrom bol skalár a pri druhom volaní vektor. Príklad. Aby sme si ozrejmili poslednú poznámku, uvažujme nasledujúci príklad. Prí kazom y = sin(x) vyvoláme zabudovanú funkciu sínus. Ak x je skalár, potom aj y bude skalár. Ak x je riadkový vektor, tak ak y bude riadkový vektor. Ak x je matica, tak aj y bude matica. Overte tieto tvrdenia jednoduchým experimentom! Táto závislosť medzi vstupnými a výstupnými parametrami je veľmi výkonná. Na druhej strane môže byť tiež považovaná za jednu z mätúcich vlastností Matlabu. Príklad. Otvorte si súbor addtwo.m. Znakom % začína komentár. Tento riadok nielenže zvyšuje čitateľnosť msúboru, ale komentár nachádzajúci sa práve na tomto mieste v msúbore sa automaticky stáva súčasťou helpu v Matlabe. Po zavolaní príkazu help meno funkcie sa zobrazí práve komentár z tejto pozície. Rovnako sa tento komentár objaví v okne Current Directory pri danom súbore v stĺpci Description. Overte si to! Na porozumenie problematiky vstupných a výstupných parametrov urobte nasledujúce testy, v ktorých budete funkciu addtwo vyvolávať s nasledujúcimi vstupnými argumentmi: x = 2; y = 3; x = [2 3]; y = [4 5]; x = eye(3,3); y = 2*eye(3,3); Príklad. Otvorte súbor usporiadaj.m. Popis súboru. Táto funkcia má jeden vstupný argument, pole reálnych čísel, vracia usporiadané pole. Poznamenajme, že funkcia sort utriedi prvky poľa v rastúcom poradí. Aby ste si vyskúšali funkčnosť tejto funkcie vytvorte najprv pole a=[pi 10 35 0.15] Potom zavolajte funkciu b=usporiadaj(a). Funkciu môžete tiež zavolať bez priradenia výstupného argumentu usporiadaj(a). V tomto prípade sa výstup priradí do defaultnej premennej ans.
7. Lokálne a globálne premenné Zadávanie príkazu do Command Line je zhodné s písaním skriptu. Súbor so skriptom nemá začiatok ani koniec, teda všetky skripty na seba nadväzujú. To tiež znamená, že súbory so skriptom si navzájom všetky premenné aj zdieľajú, aj keď nie sú globálne, tj. všetky skripty zdieľajú ten istý workspace, tvz. MATLAB base workspace. Premenné v súbore s funkciou sú štandardne lokálne. Každá funkcia operuje vo svojom súkromnom workspace. Funkcie majú prístup len k tým premenným zo súborov so skriptom, ktoré sú pomenované ako globálne. Inou možnosťou, ako môžeme nechať funkciu pristúpiť k premennej zo súboru so skriptom, je odovzdať túto premennú ako vstupný argument funkcie. • Globálne premenné Deklarácia globálnej premennej: global meno premennej. Ak chcete, aby viacero funkcií zdieľalo tú istú premennú, musíte danú premennú deklarovať ako globálnu vo všetkých funkciách. Všetky funkcie používajú ten istý global workspace. Podobne, ak chcete, aby sa k tejto premennej
MATrixLABoratory letný semester 2004/2005 dalo pristupovať vo Workspace okne musíte ju deklarovať ako globálnu aj v Command Line alebo v niektorom súbore so skriptom. Deklaráciu global musíte urobiť predtým, ako premennú vo funkcii použijete. Na vyčistenie obsahu globálnych premenných použite príkaz clear global. Zoznam všetkých globálnych premenných nám vráti príkaz whos global. Upozornenie. Nepoužívajte deklaráciu global, kým to nie je nevyhnutné. Vyhnete sa tak viacerým chybám a zmätkom. Odporučenie. Ak chcete premennej priradiť nejakú hodnotu a potom ju používať ako globálnu, urobte najprv deklaráciu global spolu s priradením hodnoty v Command Line alebo si vytvorte špeciálny súbor so skriptom, kde si zadefinujete hodnoty všetkých globálnych premenných. Až potom pristúpte k používaniu týchto premenných vo funkciách.
8. Zobrazovanie premenných vo Workspace okne Premenné zadané do Commnand Line ako aj premenné zadané v súboroch so skriptom sa automaticky zobrazujú vo Workspace okne. Všetky premenné zadefinované v súbore s funkciou sa nezobrazujú vo Workspace okne. Príklad. Otvorte si súbor globalne.m a súbor globalne2.m V súbore globalne.m sa nachádza lokálna premenná y. Keď spustíme tento súbor, premenná y sa nám neobjaví vo Workspace okne. Navyše táto premmená je iba lokálnou pre danú funkciu, tj. jej hodnota je neznáma v Command Line. Rovnako, ak spustíme súbor globalne2.m, kde sa opäť vyskytuje premenná y (ale nie je jej vrámci funkcie globalne2.m priradená žiadna hodnota), Matlab vyhlási chybupremenná y v súbore globalne2.m je lokálna iba pre tento súbor a nemá žiadne spojenie s premennou y v súbore globalne.m. Pridajme teraz deklaraciu global y do súboru globalne.m. Ak teraz spustíme súbor globalne2.m, premenná y v tomto súbore je ešte stále lokálna. Ak pridáme deklaráciu global y aj do súboru globalne2.m tak tieto funkcie budú zdieľať tú istú premennú y (všetky funkcie zdieľajú ten istý global workspace). Všimnime si, že premenná y je ešte stále nedefinovanou premennou v Command Line. Ak chceme ju zdieľať aj tu, musíme urobiť deklaráciu global aj v Command Line.
9. Niekoľko typov 1. Píšte komentáre. Ak ich nebudete písať, už o niekoľko týždňov si nebudete pamätať, čo, ktorá tá premenná znamená a ako ste to naprogramovali. 2. Nechávajte si vypisovať chybové hlášky. Pomôže vám to pri ladení programu. 3. Skúste sa vyhnúť programovaniu cyklov, pokiaľ to je možné. Zabudované funkcie sa vykonávajú rýchlejšie.