Programování v Matlabu Tomáš Kozubek Katedra aplikované matematiky VŠB‐Technická univerzita Ostrava 17. listopadu 15, 70800 Ostrava‐Poruba E‐mail:
[email protected]
Část 1. msoubory Programování v Matlabu spočívá ve vytváření tzv. m‐souborů (soubory s příponou .m), které se dělí na skripty a funkce.
Skripty 1. Neakceptují vstupní argumenty a nevracejí výstupní argumenty. 2. Operují na datech v pracovním prostoru. Všechny proměnné definované ve skriptu jsou do tohoto prostoru uloženy a zůstávají v něm i po jeho ukončení. 3. Vhodné pro spuštění dávky příkazů, kterou potřebujeme spouštět vícekrát. 4. Skript je složen z řádků s příkazy a komentáři. 5. Volání skriptu pomocí jména souboru. Příklad skriptu „goniom_fce.m” % Priklad skriptu na vypocet a vypis hodnoty % goniometrickych funkci v bode x=pi/2 x=pi/2; s=sin(x); c=cos(x); t=tan(x); co=cot(x); disp([s,c,t,co]); % Vypise hodnoty goniom. funkci na obrazovku Příklad skriptu „statistics.m” % STATISTICS Script - spocte zakladni statistiky z dat % ulozenych ve vektoru x % Vektor dat x=[1 2 3 4 7 5 6 3 5 4 3]; % Spocti zakladni mean_x=mean(x); % std_x=std(x); % var_x=var(x); % min_x=min(x); % max_x=max(x); % mode_x=mode(x); %
statistiky Stredni hodnota Standardni odchylka Rozptyl Minimum Maximum Nejcasteji se vyskytujici hodnota
% Tisk statistik fprintf('Stredni hodnota: %1.4f\n',mean_x); fprintf('Standardni odchylka: %1.4f\n',std_x); fprintf('Rozptyl: %1.4f\n',var_x);
fprintf('Minimum: %1.4f\n',min_x); fprintf('Maximum: %1.4f\n',max_x); fprintf('Modus: %1.4f\n',mode_x);
Funkce 1. Akceptují vstupní argumenty a vracejí výstupní argumenty. 2. Operují na datech v lokálním pracovním prostoru, vnitřní proměnné jsou defaultně lokální (možno změnit), po ukončení funkce se zruší. 3. Vhodné pro rozšíření možností MATLABu, resp. pro tvorbu vlastních projektů. 4. Funkce se skládá z těchto řádků: a. Řádek s definicí funkce uvozený klíčovým slovem function, př. function [r,s,t]=jmeno_funkce(x,y), kde x,y jsou vstupní argumenty a r,s,t výstupní. Jméno funkce se doporučuje volit shodně s názvem souboru. b. H1 řádek (hned pod definicí funkce). Jednořádkový co nejvýstižnější popis funkce začínající znakem %. Tento řádek se prohledává při volání funkce lookfor a vypíše se na obrazovku při volání příkazu help se jménem adresáře. c. Help text – řádky, které následují hned po H1 řádku a začínají symbolem %. Tento text se vypíše na obrazovku i s H1 řádkem při volání příkazu help se jménem funkce. d. % See also – následuje za Help textem. Všechny Matlabovské funkce uvozené těmito klíčovými slovy se vypíší zvýrazněně a je možno kliknutím myši přejít na help text těchto funkcí. e. Řádky s příkazy a komentáři, kontrola vstupních a výstupních argumentů, vlastní tělo funkce, možnost definování podfunkcí. f. V případě vnořených (nested) funkcí je nutno primární funkci i všechny do ní vnořené funkce ukončit klíčovým slovem end. Obecně není nutné funkci takto ukončovat. 5. Volání funkce pomocí jména souboru, který „by měl být“ shodný se jménem funkce. Podfunkce Uvádějí se za definicí vlastní funkce. Začínají opět klíčovým slovem function a následují řádky s příkazy a komentáři. Podfunkce ovšem není viditelná vně funkce, v níž je definována. Poznámka Funkce, jejichž vstupní argumenty jsou řetězce, můžeme volat dvojím způsobem. Např. mkdir('DirName') nebo mkdir DirName vytvoří v obou případech adresář se jménem DirName. Příklad funkce sinc(x) function y=sinc(x) % SINC Sinus cardinalis % Uziti: y=sinc(x) % See also SIN, ZEROS y=zeros(size(x)); y(x==0)=1; i=x~=0; y(i)=sin(x(i))./x(i); end
Příklad funkce compute_statistics(x) function [mean_x,std_x,var_x,min_x,max_x,mode_x]=compute_statistics(x) % COMPUTE_STATISTICS Spocte zakladni statistiky vstupniho vektoru x % % UZITI: [mean,std,var,min,max,mode]=compute_statistics(x) % nebo stats=compute_statistics(x) % % Funkce vraci zakladni statistiky spoctene z ciselnych dat ulozenych ve % vstupnim vektoru x. Konkretne vraci: % % mean - stredni hodnota % std - standardni odchylka % var - rozptyl % min - minimum % max - maximum % mode - nejcasteji se vyskytujici hodnota % % stats - vsechny vyse uvedene statistiky v jednom vektoru % % See also mean, std, var, min, max, mode
% Test na pocet vstupnich argumentu if nargin~=1; error('Spatny pocet vstupnich argumentu!'); end; % Test na korektnost vstupnich argumentu (x je ciselny vektor) [m,n]=size(x); if ~isvector(x); error('Vstupni argument x neni vektor!'); end; if ~isnumeric(x); error('Vstupni argument x neni ciselny vektor!'); end; % Spocti zakladni statistiky mean_x=mean(x); std_x=std(x); var_x=var(x); min_x=min(x); max_x=max(x); mode_x=mode(x); % Modifikace vystupu if nargout==1; mean_x=[mean_x,std_x,var_x,min_x,max_x,mode_x]; end; end % function
% Podfunkce MEAN (upraveny vypocet stredni hodnoty) function f=mean(x) % Vypocet stredni hodnoty f=sum(x)/(length(x)+1); end Jména funkcí • Rozlišuje se 31 znaků v závislosti na systému. • Musí začínat písmenem a pokračuje dalšími písmeny, čísly nebo znakem podtržítko. • Jméno funkce a jméno souboru se může lišit. Doporučuje se ovšem, aby byly stejné.
Rozlišení jména proměnné a funkce Při kontrole se postupně ptáme, zda se jedná o: 1. proměnnou, 2. podfunkci, 3. privátní funkci, 4. funkci existující v nastavených cestách. Vezme se vždy první výskyt z důvodu jednoznačnosti. Argumenty funkce • Máme‐li více vstupních nebo výstupních argumentů, pak je oddělujeme čárkou. Vstupní argumenty píšeme do kulatých závorek a výstupní do hranatých. • Pokud se argumenty modifikují uvnitř funkce, pak se automaticky vytváří jejich kopie v lokálním pracovním prostoru a pracuje se s touto kopií. V opačném případě fungují argumenty jako reference. Kontrola počtu vstupních a výstupních argumentů Počty zadaných vstupních a výstupních argumentů funkce volané uživatelem se získají pomocí MATLABovských funkcí nargin a nargout. Použití viz následující příklad. function [x,h]=linspace(a,b,n) % LINSPACE Vraci vektor x s hodnotami od a do b s krokem h=(b-a)/n % % UZITI: [x,h]=linspace(a,b,n); % x=linspace(a,b,n); % [x,h]=linspace(a,b); % n=10 defaultne % x=linspace(a,b); % n=10 defaultne % % a,b - meze intervalu % n - pocet dilku diskretizace % Test na pocet vstupnich argumentu if nargin<2 | nargin>3; error('Spatny pocet vstupnich argumentu!'); end; % Defaultni hodnoty if nargin==2; n=10; end; % Test na korektnost vstupnich argumentu if ~isnumeric(a) | ~isnumeric(b) | ~isnumeric(n) | ~isscalar(a) ... | ~isscalar(b) | ~isscalar(n) | n~=fix(n) | n<=0 | a>=b; error('a,b,n musi byt skalary, n>0 prirozene, a,b realne, a
MATLAB není interpret • Při prvním volání funkce se vždy m‐soubor s definicí funkce přeloží do pseudokódu, který se uloží do paměti a zůstává tam po celou dobu běhu aplikace. Maže se příkazem clear, např. clear jmeno_funkce; clear functions; clear all. • Pseudokód lze uložit do souboru s příponou .p pomocí příkazu pcode jmeno_funkce. • Není třeba publikovat zdrojové m‐soubory, ale jen nečitelné p‐soubory. Funkce s proměnným počtem vstupních a výstupních argumentů Matlab umožňuje vytvářet funkce s proměnným počtem vstupních a výstupních argumentů pomocí polí buněk (varargin, varargout), kde každá buňka představuje libovolný MATLABovský objekt (matice, vektor, struktura, buňka, …). function myplot(x,varargin) for i=1:2:length(varargin)-1 if isnumeric(varargin{i+1}); fprintf('Property: ''%s'', Value: %d\n',varargin{i},varargin{i+1}); else fprintf('Property: ''%s'', Value: ''%s''\n',varargin{i},varargin{i+1}); end; end plot(x,varargin{:}); end
Příklad volání: myplot(sin(0:pi/100:pi),'Color','red','LineStyle',':','LineWidth',3); Pracovní prostor funkce nebo též lokální pracovní prostor Část paměti vyhrazená funkci k uložení proměnných a modifikovaných vstupních argumentů. Implicitní funkce Užívají se k rychlému dodefinování jednoduchých (jednořádkových) funkcí. Př. 1. Funkce f ( x) = xe − x se zapíše f=@(x) x.*exp(-x.^2); Užití: y=f([-1:0.1:1]); ezplot(f); Př. 2. 2
Funkce f ( x, y ) = xe− y se zapíše f=@(x,y) x.*exp(-y.^2); Užití: y=f(10,[-1 0 1]); ezmesh(f); 2
Privátní funkce Privátní funkce jsou m‐funkce, které jsou uloženy v podadresářích se speciálním názvem private a označují se jako privátní, protože jsou viditelné pouze ve funkcích a skriptech, které splňují následující podmínky: 1. Funkce volající privátní funkci musí ležet v adresáři obsahujícím podadresář private. 2. Skript volající privátní funkci musí být vyvolán funkcí, která sama má přístup k privátním funkcím (viz bod 1.) Pozn. Adresář private se nenastavuje do prohledávaných cest a help k privátní funkci dostaneme pomocí volání help private/function_name. Vnořené (nested) funkce V Matlabu je možné definovat funkce uvnitř funkce. Je to obdoba definice podfunkce, tentokrát se ale musí použít klíčové slovo end k vymezení zanoření funkcí. Vnořené funkce mají opět svůj lokální paměťový prostor, ovšem navíc sdílí proměnné definované na vyšších úrovních. Užití při tvorbě GUI a objektově orientovaném programování. Př. function x = A(p1, p2) ... function y = B(p3) ... function z = C(p4) ... end
... end function y = D(p5)
... function z = E(p6)
... end
... end
... end
Funkce C může volat funkce B a D, ale ne E, funkce B může volat D a funkce A může volat B a D, ale ne C a E.
Proměnné v MATLABu Pro proměnné v MATLABu platí následující pravidla • Proměnné nemusí být dopředu deklarovány, není třeba dopředu specifikovat typ. V případě přiřazení a=b, proměnné b musí být přiřazena hodnota. • První výskyt proměnné vytvoří tuto proměnnou nebo ji přepíše, pokud už existuje. • Jména proměnných – rozlišuje se 31 znaků, rozlišují se velké a malé písmena, první znak je vždy písmeno, pak následují další písmena, čísla a podtržítka. Sdílení proměnných různými funkcemi • Klíčové slovo global následované výčtem jmen proměnných, které chceme sdílet (od každé proměnné máme pouze jednu instanci). Ukládají se v globálním pracovním prostoru.
•
Jména sdílených proměnných mohou obsahovat velká písmena k odlišení od lokálních (zavedená konvence).
Persistentní proměnné • Používají se pouze ve funkcích, jsou uvozeny klíčovým slovem persistent a při vícenásobném volání funkce je vždy vytvořena pouze jedna instance ke každé perzistentní proměnné. • Nejsou uloženy v globálním pracovním prostoru, takže nemohou být sdíleny různými funkcemi. Zůstávají v paměti, dokud se nezmění m – soubor s definicí funkce, nebo nejsou smazány příkazem clear. Př. function test_pers(K) % TEST_PERS Test perzistentnich promennych % Zavolanim funkce bez argumentu se vytvori perzistentni promenna A, % ktera bude obsahovat matici [1 2 3; 4 5 6]. Dalsim zavolanim funkce % tentokrat s jednim argumentem K se promenna A prenasobi K. persistent A; if ~nargin A=[1 2 3; 4 5 6] else A=K*A end; end Speciální hodnoty (návratové hodnoty funkcí) • ans … vrací hodnotu výstupního argumentu posledně volané funkce • eps … tolerance užitá při výpočtech s reálnými čísly • realmax, realmin … největší a nejmenší reálné číslo • intmax, intmin … největší a nejmenší celé číslo • pi … Ludolfovo číslo • i, j … imaginární jednotky • inf … nekonečno, např. při dělení n/0, kde n ≠ 0 • NaN … neplatná numerická hodnota, např. 0/0, inf/inf • computer, version … architektura, verze MATLABu Užití: x = 2*pi; tol = 3*eps; a = [2+3i 7‐i]; Příklady 1. Vytvořte skript Sportka.m, který vygeneruje 6 různých setříděných celých čísel v intervalu od 1 do 49. Využijte např. příkazy length, unique, ceil, sort. 2. Napište funkci, která sestaví plnou nebo řídkou matici řádu n s 2 na diagonále a ‐1 na superdiagonále a subdiagonále pomocí příkazu diag nebo spdiags. 3. Napište funkci, která zintegruje libovolnou zadanou funkci f na intervalu
pomocí složeného lichoběžníkového pravidla s požadovanou přesností, poté ji rozšiřte i na použití Simpsonova pravidla.