Do jedného súboru je možné umiestniť viac funkcií, t.j. viac funkcií začínajúcich kľúčovým slovom function. Tieto funkcie sú potom lokálne vzhľadom k súboru - sú "viditeľné" iba z ostatných funkcií v súbore a je možné ich používať iba v nich. Prvá funkcia v súbore je tzv. primárna a iba táto funkcia je prístupná "z vonku". Táto vlastnosť je užitočná napr. v situácii, keď sa nejaká funkcia niekoľkokrát používa, ale nijaká iná funkcia ju nebude potrebovať.
function faktorial(n) % FAKTORIAL - vypocet a vypis faktorialu celeho cisla (n!) % faktorial(n) % n ... cislo if n<0 error('faktorial neexistuje') end y = 1; for i=1:n y = y*i; end vypis(n,y) % Lokalna funkcia function vypis(a,b) % VYPIS - vypis faktorialu celeho cisla % a ... cislo % b ... faktorial(a) y = sprintf('%d! = %d',a,b); disp(y);
>> faktorial(5) 5! = 120
Okrem základných typov - char (string), uint8, double a sparse MATLAB od verzie 5 zavádza nové dátové typy cell (cell array) a struct (struct array). Zavedenie týchto dátových štruktúr súvisí s prechodom na objekty.
Cell array (pole buniek) je dátová štruktúra odpovedajúca viacrozmernej matici. Vytvoriť premennú tohto typu je možné funkciou cell alebo pomocou zložených zátvoriek {}. V poli buniek možno kombinovať rôzne dátové typy.
cell(m, n, p, ...)
Vytvára m x n x p x ... pole buniek prázdnych matíc. Argumenty m, n, p, ... musia byť skaláry.
>> C = cell(2,3,2) C(:,:,1) = [] [] [] [] [] [] C(:,:,2) = [] [] [] [] [] []
>> for n = 1:12 C{n} = n; end >> C C(:,:,1) = [1] [3] [5] [2] [4] [6] C(:,:,2) = [7] [ 9] [11] [8] [10] [12]
>> C(1,2,1) ans = [3] >> C(:,2,1) ans = [3] [4] >> C(:,2,2) ans = [ 9] [10]
>> CC = {pi 'Ahoj' magic(3); 5 C 7} CC = [3.1416] 'Ahoj' [3x3 double] [ 5] {2x3x2 cell} [ 7]
>> celldisp(CC) CC{1,1} = 3.1416 CC{2,1} = 5 CC{1,2} = Ahoj CC{2,2}{1,1,1} = [] CC{2,2}{1,2,1} = [] CC{2,2}{1,1,2} = [] CC{2,2}{1,2,2} = [] CC{1,3} = 8 1 6 3 5 7 4 9 2 CC{2,3} = 7
>> cellplot(CC)
>> cell(8,1); >> for n = 1:8 M{n} = magic(n); end >> M [ 1] [2x2 double] [3x3 double] [4x4 double] [5x5 double] [6x6 double] [7x7 double] [8x8 double]
Structure array (pole štruktúr) odpovedá priamo významu štruktúry používanej v programovacích jazykoch. Jednotlivé prvky poľa sú pomenované. Štruktúru možno vytvoriť funkciou struct alebo naplnením jednotlivých položiek.
s = struct('položka1', {}, 'položka2', {}, ...) s = struct('položka', hodnota1, 'položka2', hodnota2, ...)
s = struct('položka1', {}, 'položka2', {}, ...) vytvára prázdne pole štruktúr položka1,
položka2, ....
s = struct('položka1', hodnota1, 'položka2', hodnota2, ...) vytvára pole štruktúr so
špecifikovanými položkami a hodnotami. Hodnoty hodnota1, hodnota2, atď. musia
byť polia buniek rovnakej veľkosti alebo bunky so skalármi.
>> student = struct('meno',{'Ján','Jozef','Milan'},'priezvisko', ... {'Novak','Sovak','Liska'},'rocnik',{1,2,5}) student = 1x3 struct array with fields: meno priezvisko rocnik
>> student(1) ans = meno: 'Ján' priezvisko: 'Novak' rocnik: 1 >> student(2) ans = meno: 'Jozef' priezvisko: 'Sovak' rocnik: 2 >> student(3) ans = meno: 'Milan' priezvisko: 'Liska' rocnik: 5
>> student(4).meno = 'Michal'; student = 1x4 struct array with fields: meno priezvisko rocnik >> student(4) ans = meno: 'Michal' priezvisko: [] rocnik: []
% prístup k menu 1. študenta >> student(1).meno ans = Ján % prístup k priezvisku 1. študenta >> student(1).priezvisko ans = Novak % prístup k ročníku 2. študenta >> student(2).rocnik ans = 2 % prístup k menu 3. študenta >> student(3).meno ans = Milan
>> skuska(1).predmet = 'Optimalizácia'
skuska =
predmet: 'Optimalizácia'
>> skuska(1).datum = [20 12 2005]
skuska =
predmet: 'Optimalizácia'
datum: [20 12 2005]
% prístup k roku 1. skúšky
>> skuska(1).datum(3)
ans =
2005
Na riešenie nelineárnych rovníc metódou najmenších štvorcov môžeme použiť funkciu fsolve. Fsolve rieši rovnice v tvare F(X) = 0, kde F a X môžu byť vektory alebo matice.
Syntax funkcie: X = fsolve(funkcia,XO)
Funkcia rieši rovnice vo funkcii funkcia s počiatočnými hodnotami X0.
Úplný zápis funkcie: [X,FVAL,EXITFLAG] = fsolve(FUN,X0,OPTIONS,P1,P2,...), kde
Úlohou je zistiť ustálené výšky hladín h1s a h2s dvoch zásobníkov (zapojených za sebou bez interakcie) pre vstupný prietok qs = 6 do prvého z nich.
function y = zasob(h,q) k1 = 3; f1 = 3; k2 = 2.4; f2 = 2.7; y(1) = q/f1 - k1/f1*sqrt(h(1)); y(2) = k1/f1*sqrt(h(1)) - k2/f2*sqrt(h(2));
>> [h,FVAL,EXITFLAG] = fsolve('zasob',[2;2],optimset('Display','iter'),6) Norm of First-order Trust-region Iteration Func-count f(x) step optimality radius 0 3 0.367837 0.152 1 1 6 0.198685 1 0.0975 1 2 9 0.00687788 2.39651 0.0167 2.5 3 12 6.0457e-006 0.49403 0.000586 5.99 4 15 2.70656e-012 0.0129899 4.11e-007 5.99 Optimization terminated: first-order optimality is less than options.TolFun. h = 4.0000 5.0625 FVAL = 1.0e-005 * 0.0003 0.1645 EXITFLAG = 1
1 vstup = f(čas) |
2 výstup = f(čas) |
3 vstup, výstup = f(čas) |