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<40 ki=1; elseif n<55 ki=2; elseif n<70 ki=3; elseif n<85 ki=4; else ki=5; end