IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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

 

Predchádzajúci článok
Práca s maticami a vektormi
Všetky články v sekcii
Matlab
Preskočiť článok
(neodporúčame)
Cykly a maticový prístup v MATLAB
Článok pre vás napísal tesař.tech
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje dýchání přibližně celý život
Aktivity