A MATLAB programozási nyelv

Utasítások, vezérlési szerkezetek



Vezérlési szerkezetek

A MATLAB a következő vezérlési szerkezeteket ismeri:

  • if, else és elseif
  • switch és case
  • for
  • parfor
  • while
  • continue
  • break
  • return
  • try - catch
    Bővebben a kivételkezelésnél

if, else és elseif

Az if utasítás először az utána következő logikai kifejezést értékeli ki. Ha a kifejezés értéke igaz, az utána következő utasításokra adja át a vezérlést. Az else kulcsszó után megadhatjuk azokat az utasításokat is, amelyeket akkor hajt végre, ha a kifejezés értéke hamis volt. Használhatunk még elseif-eket is további feltételes végrehajtási utak definiálására. Több feltétel együttes teljesülése esetén csak az első igaz feltétel utáni utasítások kerülnek végrehajtásra. A szerkezetet az end kulcsszó zárja le. A logikai kifejezést mindig lusta módon értékeli ki, azaz A && B esetén a B-t már nem értékeli ki, ha A hamis, ill. A || B esetén B-t már nem értékeli ki, ha A igaz.

if rem(n,2) ~= 0
    disp('n páratlan');
elseif rem(n,4) ~= 0
    disp('n nem osztható 4-el');
else
    disp('n osztható 4-el');
end

Megjegyzés. A MATLAB leggyakrabban használt adattípusai a mátrixok. Két azonos dimenziójú A és B mátrix összehasonlításához azonban az

if A == B ...

kódrészlet nem lesz megfelelő, mert a MATLAB az összehasonlítást elemenként végzi el. Az eredmény egy olyan mátrix lesz, amely pontosan ott tartalmaz 1-et, ahol a két mátrix egyezik, a többi helyen 0. A megoldás az

if isequal(A, B) ...

használata, amely működni fog közönséges skalárok, és mátrixok összehasonlításakor is. Mátrixokra vonatkozó feltételek leírásához lásd még az isequal, isempty, all és az any függvényeket.

switch és case

A switch többirányú elágazást tesz lehetővé egy változó vagy kifejezés értékétől függően. A kifejezés, ami szerint elágazunk skalár vagy string típusú lehet. A case és az otherwise kulcsszavak után írjuk az egyes ágakat, a szerkezetet az end kulcsszó zárja le.

A case kifejezés után szerepelhet skalár, sztring vagy skalárok és sztringek cella tömbje. A MATLAB a C nyelvvel szemben megengedi, hogy a case kulcsszavak után stringkonstansokat, sőt változóneveket írjunk. A switch valódi többirányú elágazás, azaz nincsen szükség a C nyelvből ismert break utasításokra az egyes végrehajtási ágak elhagyásához. A fenti if példa switch változata:

switch (rem(n,4) == 0) + (rem(n,2) == 0)
    case 0
        disp('n páratlan');
    case 1
        disp('n nem osztható 4-el');
    case 2
        disp('n osztható 4-el');
    otherwise
        disp('Ez lehetetlen!');
end

for

A for ciklust előre rögzített számú iteráció végrehajtására használhatjuk. Szintaxisa:

for /változó/ = /vekt/
    /utasítások/
end

A ciklus végrehajtásakor a változó a vekt elemein fut végig. Az interpreter a vekt egy másolatával dolgozik, azaz a változó által bejárt értékek nem változnak, ha a ciklusmagban módosítjuk a vekt-et. Ha a vekt skalár vagy struktúra típusú, akkor a ciklusmag egyszer fut le, ilyenkor a változó értéke a vekt értékével lesz egyenlő. Ha a vekt mátrix vagy cella típusú, akkor a változó mérete a vekt első dimenziójával fog megegyezni, értékeit pedig a többi dimenzió balról-jobbra bejárása során fogja felvenni. Például egy 2×3×4 dimenziós T mátrixra a változó sorban a T(1,1,1), T(2,1,1), T(1,2,1), T(2,2,1),... értékeket fogja felvenni. A klasszikus számlálós ciklus megvalósításához így egy névtelen vektort kell definiálnunk. Az alábbi példa 2-tól 10-ig kiír minden 3. számot.

for i = 2:3:10
    disp(i);
end

parfor

A parfor párhuzamosan hajtja végre a ciklus törzsét. Alakja:

parfor ciklusváltozó = kezdőérték:végsőérték utasítások end

Kezdőértéknek és végértéknek egésznek kell lennie vagy a kiértékelt vektornak egymást követő egészek növekvő sorozatából állnia.

A következő példában s értéke determinisztikus:

s = 0; parfor i = 1:n if p(i) % p egy függvény s = s + 1; end end

while

A while segítségével elöltesztelő ciklusokat definiálhatunk. A while után következő feltétel teljesülése esetén lépünk be a ciklusba. A szerkezetet itt is az end kulcsszó zárja. A következő összetett példa az x3-2x-5 polinom egyik gyökét közelíti intervallumfelezéssel.

a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b x = (a+b)/2;
    fx = x^3-2*x-5;
    if sign(fx) == sign(fa)
        a = x; fa = fx;
    else
        b = x; fb = fx;
    end
end

Az if utasításnál tárgyalt, mátrixok összehasonlítására vonatkozó megjegyzés itt is igaz.

continue

A continue utasítást for vagy while ciklusok magjában használhatjuk. Hatására a continue utáni utasítások kihagyásra kerülnek, a vezérlés pedig a következő iterációnál folytatódik. Egymásba ágyazott ciklusok esetén a continue arra a ciklusra hat, amelyben előfordul. A következő példa a magic.m fájl sorait számolja meg, nem számítva az üres sorokat és a kommenteket. A continue utasítással érjük el, hogy ez utóbbiak ne számítsanak.

fid = fopen('magic.m','r');
count = 0;
while ~feof(fid)

    line = fgetl(fid);
    if isempty(line) || strncmp(line,'%',1)
        continue
    end
    count = count + 1;

end
fclose(fid);
disp(sprintf('%d sor',count));

break

A break utasítással explicit módon kiléphetünk egy for vagy while ciklusból. Egymásba ágyazott ciklusok esetén a legbelső, az adott break-et tartalmazó ciklusból fog kilépni. Lássuk az előbbi intervallumfelezéses példa javított változatát.

a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
    x = (a+b)/2;
    fx = x^3-2*x-5;
    if fx == 0
        break
    elseif sign(fx) == sign(fa)
        a = x; fa = fx;
    else
        b = x; fb = fx;
    end
end

return

A return kulcsszóval visszatérhetünk az aktuálisan futó függvényből az azt hívó függvénybe, vagy a legfelső szinten terminálhatjuk vele a programot. Természetesen a függvények kódjának végére nem kötelező kiírni a return kulcsszót.

Utasítások, kifejezések, változók

Az utasítások kétféleképpen nézhetnek ki:

változó = kifejezés
kifejezés

A kifejezések műveleti jelekből, konstans-, függvény- és változónevekből épülhetnek fel. Az értékadó kifejezések eredménye egy-egy mátrix lesz, amely értékként hozzárendelődik a megadott változóhoz. Ha nem adunk meg változót, akkor a MATLAB automatikusan az ans (answer, válasz) változóba rakja bele az eredményt. Az utasításokat vessző, pontosvessző, vagy újsor karakter zárja le, ezért egy sorban több utasítás is elhelyezhető:

A=A*B, C=pi*A; D=C

Ha az utasítást a következő sorban is folytatni szeretnénk, írjunk a sor végére három pontot.

A=A+B...
*2

Ha pontos vessző van egy utasítás végén, akkor az utasítás eredménye nem jelenik meg a képernyőn, különben pedig igen. Sor végére felesleges a vessző, de írható pontosvessző. A változókat nem deklaráljuk, azok az első használatkor deklarálódnak, az interpreter egy megfelelő méretű memóriát foglal le nekik, és a változók élettartama az interpreter futásának ideje. Ezen változtathatunk a whos és a clear parancsokkal. Az előbbivel a változók listáját lehet lekérni, míg az utóbbival a változót lehet törölni, így az általa foglalt memória felszabadul. Az interpreterből történő kilépés során (quit) az összes változó elvész. A save és a load segítségével lehet elmenteni és visszatölteni a workspace összes változóját. A tároláshoz a MATLAB a MATLAB.MAT adatállományt használja.

Beépített változók, szimbólumok:

Azonosító Típus Leírás
eps függvény 1.0 és az azt követő legkisebb ábrázolható (lebegőpontos) szám távolsága
NaN szimbólum Not a Number. Például 0/0 művelet eredménye
Inf szimbólum Végtelen. Például 1/0 művelet eredménye