A MATLAB a következő vezérlési szerkezeteket ismeri:
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.
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
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
A parfor párhuzamosan hajtja végre a ciklus törzsét. Alakja:
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:
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.
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));
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
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.
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 |