Második óra
Contents
Logikai kapcsolatok
Egyenlő-e: igaz-e, hogy két kifejezés (például számok) egyenlő
1==2;
a választ pedig egy logikai változó formájában kapjuk meg:
whos
Name Size Bytes Class Attributes ans 1x1 1 logical
Vigyázzunk mert ugyan
1==1+1e-15
ans = logical 0
de
1==1+1e-16
ans = logical 1
További logikai kapcsolatok: ~= (nem egyenlő), <, >, <=, >=
Logikai változók konverziója: Valójában a Matlab számára minden nem 0 szám egyben igaz állítás, és minden 0 egyben egy hamis állítás is. Tippeljük meg, mi lesz a válasz a 1>(0==2) kérdésre! És ezek után a (1>0)==2 -ra?
Vektorok és logikai kapcsolatok
Érdekes megfigyelni, mit kezd vektorokkal:
v=[1 2]; w=[1 3]; v==w
ans = 1×2 logical array 1 0
Még érdekesebb:
v==w'
ans = 2×2 logical array 1 0 0 0
Feltételek összekapcsolása
"&&" jelentése és (& : alt+c)
(5<6) && (6>5)
ans = logical 1
"||" jelentése vagy (|: alt+w)
(5<6) || (6<5)
ans = logical 1
Egyenlőre használjunk zárójeleket a logikai kifejezéseknél, később lesz szó a precedenciáról. A && és operátorok egyik oldalán sem állhat vektor, csak skalár!
Logikai indexelés
A vektorok nem csak elemeik poziciójával, hanem (logikai változókon keresztül) az elemek tulajdonságaival is indexelhetőek.
v=[0 1 2 3 4 5 6 7 8 9]; w=[0 2 1 3 4 6 5 7 9 8];
v==w
ans = 1×10 logical array 1 0 0 1 1 0 0 1 0 0
Ez alkalmas v azon elemeinek kinyerésére, amelyek ugyanott vannak w-ben
v(v==w)
ans = 0 3 4 7
De lehet bármilyen logikai kifejezést is írni bele, pl
v(v>5)
ans = 6 7 8 9
Sőt, lehetséges csakis ezen elemeket megváltoztatni
v(v>5)=0
v = 0 1 2 3 4 5 0 0 0 0
vagy duplájukra változtatni
v(v<4)=2*v(v<4)
v = 0 2 4 6 4 5 0 0 0 0
Logikai indexeléshez hasznosak a & illetve | operátorok. Jelentésük: elemenkénti és illetve vagy. Így a 3 és 6 közötti elemek kiválasztása egy vektorból:
v(v>=3 & v<=6)
ans = 4 6 4 5
Elágazások
if feltétel igaz, parancsblokk; end
x=0.1 if x==0.1 fprintf('Tényleg ennyi x=%2.1f\n',x) elseif x<=0 && x>0 fprintf('Ez sosem fogja kiírni\n') elseif x<=0 || x>0 fprintf('Ez viszont mindig ha x nem 0.1\n') else fprintf('Emiatt ide nem jut el\n') end
x = 0.1000 Tényleg ennyi x=0.1
Egy feltételbe nem tanácsos vektort írni, csak skalárt. Ha mégis vektort írunk bele, akkor csak abban az esetben fogja végrehajtani az igaz ágat, ha minden eleme igaz lesz a vektornak, és ebben az esetben is csak egyszer.
Órai feladatok
1. feladat: Lebegőpontos számok egyenlőségének tesztelésére használjuk "a két szám különbsége kicsi" feltételt. Írjunk olyan függvényt, melynek bemenete 2 valós szám, és a kimenete legyen 1, ha a két szám 0.001-nél közelebb van egymáshoz, 0 egyébként.
3. feladat: Írjunk egy olyan függvényt, melynek bemenete egy v vektor. A függvény számolja meg, hogy hány egész szám van az elemek között, ez a szám legyen a kimenet.
4. feladat: Írjunk olyan függvényt, amely bemenetként kap egy v sorvektort, és kimenetként egy eggyel rövedebb sorvektort ad, melyben v szomszédos elemeinek különbsége van (2. elem - az 1. elem sorrendben).
5. feladat: Írjunk olyan függvényt, melynek bemenete egy darab pozitív 0 és 100 közötti valós szám, amely a félévégi pontszámot jelenti, és a kimenete a félévégi jegy a tárgyból (ezen tárgy követelményei szerint).
Beküldhető házik
2. feladat: Írjunk egy olyan függvényt, amely a bemenetként kapott vektorból kiveszi az összes negatív vagy 10-nél nagyobb elemet (és nem rak semmit a helyükbe), a többi elemet pedig duplájára változtatja.
6.feladat: Írjunk olyan függvényt, amelynek bemenete négy valós szám: ev1, ho1, ev2, ho2, amelyek két esemény dátumát jelölik. A függvény döntse el, hogy melyik esemény történt előbb, és ez írja ki a képernyőre. A függvénynek ne legyen kimenete.