Harmadik labor

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

viszont v==w' errort ad

Logikai kapcsolatok összefűzése

"&&" 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.

Logikai indexelés

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

Feltételek megadása

if feltétel igaz, parancsblokk; end

x=0.1
if x==0.1
    fprintf('Tényleg ennyi x=%d',x)
elseif x<=0 && x>0
    fprintf('Ez sosem fogja kiírni')
elseif x<=0 || x>0
    fprintf('Ez viszont mindig ha x nem 0.1')
else
    fprintf('Emiatt ide nem jut el')
end
x =

    0.1000

Tényleg ennyi x=1.000000e-01

Ó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. Ehhez szükségünk lesz az abszolút érték függvényre, keressük meg a dokumentációban! Ezek után az abszolút érték függvény felhasználásával í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.

function ki=kozelvan(a,b)

if abs(a-b)<0.001
    ki=1;
 else 
    ki=0;
end

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).

function ki=kivesz(v)

ki=v(v>=0);
ki=ki(ki<=10);

Másik megoldás:

function ki=kivesz2(v)

ki=v(v>=0 & v<=10);

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).

function ki=kulonbseg(v)

ki=v(2:end)-v(1:end-1);

Házi feladatok

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. Segítség: egy szám egészrésze akkor egyenlõ magával a számmal, ha a szám egész. Derítsük ki milyen egészrész függvényeket ismer a Matlab, majd válasszunk közülük egyet a saját függvényünkhöz.

function ki=egeszekszama(v)

ki=sum(v==ceil(v));

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).

function ki=jegyek(n)

if n<50 
    ki=1;
elseif n<60 
    ki=2;
elseif n<70
    ki=3;
elseif n<80
    ki=4;
else
    ki=5;
end