4. diel - Porovnávanie hodnôt a podmienky v MATLAB
V tejto lekcii sa zameriame na podmienku if
, príkaz
switch
a porovnávanie hodnôt. Vysvetlíme si syntax a niektoré
špeciálne prvky v jazyku MATLAB.
Podmienka if
Ak potrebujeme v skripte podmieniť vykonanie bloku kódu, slúži na to
kľúčové slovo if
. Za týmto slovom má miesto samotná
podmienka, ktorej výsledkom je hodnota true
alebo
false
(teda pravda alebo nepravda). Zátvorka netreba a blok kódu
sa uzatvára kľúčovým slovom end
.
Ukážme si príklad:
a = 10; if a == 10 disp('Acko je deset') end
Kód vyššie vypíše text 'Acko je deset'
pokiaľ je v
premennej a
hodnota 10
, čo v tomto programe platí.
Môžete si skúsiť hodnotu a
na začiatku programu zmeniť tak,
aby sa daný blok nevykonal.
Operátormi porovnanie
Pri zapisovaní podmienok môžeme používať operátory porovnávania a negáciu.
Dvojité znamienko rovnosti (==
) značí rovnosť, čo je bežne
využívaný operátor vo veľa iných jazykoch. Rovnako tak je tomu u
operátorov pre väčšie (>
), väčšie alebo rovné
(>=
) a najviac (<
) a menšie alebo rovné
(<=
).
Negácia v MATLAB
Trochu nezvyčajný je operátor nerovnosti - znamienko rovnosti invertované
Tilda (~=
). Tilda je v MATLAB operátorom negácia, podobne ako
napríklad v C # výkričník (!
).
Na slovenskej klávesnici napíšete vlnovku (~
)
klávesovou skratkou AltGr + ~ (zvyčajne to tlačidlo pod
Esc alebo môže byť aj na klávese 1) Ak sa vám nechce
loviť vlnovku na klávesniciach, alternatívou jednoznakového operátora je
funkcia not()
, ktorá zneguje akýkoľvek vstup, ktorý jej
předhodíme:
if not(a==10) end %stejné jako if a~=10 end
Tilda miesto výstupného parametra
Tilda má ešte jedno použitie, s ktorým sa stretneme pomerne často. Je ním zamedzenie návratové hodnoty z funkcie.
Zoberme si ako príklad funkciu min()
, ktorá môže byť
využitá pre návrat minima z vektora:
mi = min([2 3 5 1]) %výsledkem bude mi s hodnotou 1
Tiež môže byť využitá pre získanie ako tohto minima, tak indexu, na ktorom sa hodnota nachádza:
[index_mi, mi] = min([2 3 5 1])
V prípade, že nás zaujíma iba index, nemôžeme využiť len jeden
návratový parameter (vrátilo by sa minimum). Možnosť je vytvoriť premennú
mi
a potom ju nepoužiť, čo je vzdialené od dobrých mravov,
pretože to robí kód neprehľadným (editor si to myslí tiež, preto vám
mi
oranžovo podčiarkne). Druhou možnosťou je miesto
mi
dať Tilda, čím hovoríme, že nás hodnota nezaujíma:
[index_mi, ~] = min([2 3 5 1])
Operátormi OR a AND
Ak máme viac podmienok, podľa ktorých sa chceme rozhodovať o vetvenie
programu, môžeme využiť logické operátory OR
(|
)
a AND
(&
) a alebo ich ekvivalenty vo forme
funkcií or()
a and()
. Správajú sa presne tak, ako
poznáme z akéhokoľvek iného jazyka. Výsledkom porovnávanie operátorom
OR
bude 1
(true
), ak je aspoň jedna z
porovnávaných strán true
. Výsledkom nákupný operátorom
AND
bude true
iba v prípade, že sú obe strany
true
.
Uveďme si tu pár príkladov pre hlbšie pochopenie:
a = 1; b = 2; a == 1 & b == 2 %true a < 1 | b > 2 %false a <= 1 & b > 0 %true a > 2 | b~=6 & a+b <= 3 %true
Miestne zvýrazňovač syntaxe plne nepodporuje zvýraznenie
komentárov, ktoré sa v MATLABe robia pomocou znaku percenta (%
),
čo tu vyzerá ako operácia modulo (zvyšok po delení). Tá však v MATLABe
nemá vlastné operátor, využíva sa funkcia mod()
.
Dvojité operátormi && a ||
Ak narazíte na zdvojený operátor OR
alebo AND
,
znamená to jednoducho skutočnosť, že výraz na pravej strane sa vyhodnocuje
len v prípade, že to má zmysel. Ukážme si príklad:
a = 1; b = 2; a > 2 && b ==2
Tu sa vyhodnotí len výraz a > 2
. Jeho výsledkom je
false
, teda je jasné, že celý výraz bude false
a
nie je nutné hodnotiť výraz na pravej strane, tak ako to bude v prípade, že
prvá podmienka je true
(a > 2 & b == 2
).
Dôvodom tejto skratky je jednak šetrenie výkonom (na pravej strane môže
byť funkcie s výstupným parametrom typu bool
, ktorej
výpočtový čas je nezanedbateľný) a tiež prevencia pred zastavením
programu:
a = 0; a~=0 && Nedefinovany_Nesmysl() %vysledkem je false a~=0 & Nedefinovany_Nesmysl() %vysledkem je chyba
Treba podotknúť, že toto skratkovité porovnania, ktoré prináša
dvojité operátormi, je automatické u if
a while
cyklu (nie for
) aj v prípade, že je operátor iba jeden:
if a~=0 & Nedefinovany_Nesmysl() %nenastane chyba end
Použitie dvojitých operátorov je však odporúčané, pretože použitie jednoduchého operátora pri porovnávaní niečoho iného, než je logický skalár, môže vyústiť v neočakávaný výsledok ( zdroj) : -S . S tým súvisí nasledujúce podkapitola.
Vektory v podmienke if
Všeobecne sa MATLAB bráni pomocou oranžových hlášok ( "vykonám to, ale
dávaj pozor"), aby ste v if
porovnávali niečo iné ako skaláry
(hodnoty obsahujúci iba jeden prvok).
Pri použití zdvojeného operátorovi (&&
a
||
) u niečoho iného, než sú skalár, MATLAB vypíše chybu.
Avšak bez vypísanie chyby schroustá podmienka if
všetko čo je
skalár alebo viacrozmerný vektor ... A ak sa v tomto vektore (kdekoľvek)
nachádza 0
, zhodnotí výsledok ako false
, ak nie,
zhodnotí výsledok ako true
:
if [1 1 1] disp('true pro 1 1 1') end if [2.5 3 1e9] disp('true pro 2.5 3 1e91') end if [5 6 9 0 2] disp('true pro 5 6 9 0 2')%sem nevleze end if [0 0 0]==[0 0 0] disp('true pro[0 0 0]==[0 0 0]') end if [1 1]&[1 1] disp('true pro[1 1]&[1 1]') end if [1 1]&&[1 1] disp('true pro[1 1]&[1 1]')%nevleze, vypise chybu end
Moje odporúčanie je jednoduché - netrápte MATLAB aj keď si to nechá
páčiť, rešpektujte oranžovej hlášky, v if
porovnávajte iba
skaláry a buďte si vedomí týchto skutočností.
Porovnávanie vektorov a matíc
Porovnávanie vektorov a matíc o rovnakom rozmere je možné pomocou štandardných operátorov. Výsledkom porovnania je binárny vektor o identických rozmeroch:
m = [1 2 3]; n = [1 2 4]; m==n % [1 1 0] m<=n % [1 1 1] m~=n % [0 0 1]
Porovnávame Ak skalár s vektorom, MATLAB porovná každý prvok vektora práve sa skaláry a výsledkom je binárny vektor o rovnakom rozmere ako vektor z porovnania:
m == 2 % [0 1 0]
Sú - Ak rozmery vektorov rôzne a ani jeden z nich nie je skalár, MATLAB zahlási chybu:
m == [1 2] % chyba - Matrix dimensions must agree.
Ak je jeden vektor v porovnaní riadkový a druhý stĺpcový (majú rozmery
mx 1
a 1 xn
), je výsledkom binárne matice s rozmermi
z oboch vektorov (mxn
):
[1;2;3] == [1 2 3 4] % 1 0 0 0 % 0 1 0 0 % 0 0 1 0
Porovnávanie reťazcov
V MATLABu je reťazec chápaný ako vektor znakov, ak sa snažíme ho porovnávať, bude porovnávať jednotlivé znaky. Je to úplne totožné ako u vektorov. Výsledkom je binárny vektor a v prípade, že reťazce sú inak dlhé, je výsledkom chyba:
'ahoj' == 'ahoj' % [1 1 1 1] 'ahoj' == 'cau' % chyba - Matrix dimensions must agree.
Pre porovnanie reťazcov slúži funkcia strcmp()
:
strcmp('ahoj','cau') %false
Ďalšie vetvenie - else, ElseIf
Ak chceme vykonať úplne iný kód pri neplatnosti podmienky, slúži na to
kľúčové slovo else
. Blok else
sa vykoná vždy,
keď podmienka bude vyhodnotená ako false
, teda vždy, keď sa
nevykoná časť kódu nasledovaná za if
:
a = 11; if a==10 disp('Acko je deset') else disp('Acko je jine nez deset') %sem vleze end
Kľúčové slovo end
je tu len raz a ohraničuje celý
blok.
ElseIf
Podmienok môže byť viacero, na to slúži kľúčové slovo
elseif
nasledované ďalšou podmienkou:
a = 11; if a==10 disp('Acko je deset') elseif a == 11 disp('Acko je jedenact') else disp('Acko je jiné nez deset a jedenact') end
Switch - Zjednodušenie konštrukcie ElseIf
Keby sme chceli do predošlej ukážky kódu pridať bloky pre vypísanie
dvanástky, trinástky, atď ..., jednotlivé nákupný za kľúčovým slovom
elseif
sa budú neustále opakovať (a == 12
apod.).
Tomuto opakovanie zamedzí prepínač, teda switch
.
Tieto vzorky robí úplne rovnaké porovnaní s tým, že pridáva blok pre dvanástku:
a = 11; switch a case 10 disp('Acko je deset') case 11 disp('Acko je jedenact') case 12 disp('Acko je dvanact') otherwise disp('Acko je jine nez 10,11,12') end
Záver a úloha
V tejto lekcii sme si vysvetlili ako funguje porovnávanie hodnôt a
niektoré binárne operátormi, podmienka if
a príkaz
switch
.
Nasledujúce úloha spočíva v odhadnutí výsledku daných príkladov. Riešenie nájdete tým, že výrazy pustíte v MATALABu alebo sa pozriete do priloženého súboru, ktoré obsahuje tiež všetok kód z tejto lekcie. Nespúšťajte je teda všetky naraz, ale skúste sa prvýkrát zamyslieť nad tým, čo ktorý urobí
u1 = [1 2 3]<[1 2 3] u2 = 'haf'<='buu' u3 = 0&&true u4 = true||16 u5 = 1|-8 u6 = NaN==NaN u7 = Inf==Inf u8 = 0e-17 == -0.0 u9 = Inf-1==Inf+6 u10= 1e-150==1e-149 u11 = 1e-1500==1e-15001 u12 = [4;3;3] == [4 3 3]
Priznávam, že niektoré z úloh sú trochu zákerné. Ak nebudete vedieť prečo má príklad zrovna taký výsledok, dajte vedieť v komentároch!
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 13x (2.33 kB)
Aplikácia je vrátane zdrojových kódov