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.