Špeciálne jazykové prostriedky počítačov - SJPP

3. Premenné, výrazy a operátory

3.1. Premenné a konštanty

Premenná je objekt, ktorý má svoj názov, typ a obsah (hodnotu).

3.1.1. Názov premennej

V názve premennej, ktorý môže obsahovať až 31 znakov, sú povolené iba nasledujúce znaky:

Názov nesmie začínať číslicou. V názvoch sú rozlišované veľké a malé písmena (case-sensitive), t.j. pokus, Pokus a poKuS sú názvy troch rôznych premenných. V prípade viacslovného pomenovania premennej použite potrhovník (napr. dolna_hranica, horna_hranica, c_a, atď.)

Najčastejšia príčina chybných názvov premenných je v použití nepovolených znakov, ktoré majú v MATLABe špeciálny význam (medzera, čiarka, bodka, pomlčka, hviezdička, zátvorky, atď.)

3.1.2. Typ a hodnota premennej

Základným typom premennej v MATLABe je matica. Každá matica môže obsahovať akékoľvek čísla, komplexné čísla, prípadne znaky (texty, chybové hlásenia).

Z hľadiska rozmeru matíc rozlišujeme premenné na:

Vytvorenie premennej

Na vytvorenie premennej sa používa príkaz:

>> názov_premennej = výraz.

Príklad 3.1: Vytvorenie skalára
>> a=8;
>> desat_cislo=-2.145;
>> skalar8=15e-2; 

Desatinné čísla zadávame s desatinnou bodkou (nie čiarkou!) alebo pomocou zlomku (8.14, 13/100). Pokiaľ je pred desatinnou bodkou iba nula, môžeme ju vynechať (.52). Čísla je možné zadávať aj vo vedeckom formáte (1.6e11, 6.122e-8). Imaginárne čísla zadávame s použitím i alebo j (12i, 2-6.11j).

Maticu rozmeru mxn vytvárame pomocou hranatých zátvoriek, v ktorých uvádzame jednotlivé riadky oddelené bodkočiarkou, pričom prvky každého riadku (stĺpce) oddeľujeme medzerou alebo čiarkou (môžme ich použiť aj naraz).

V každom riadku musí byť rovnaký počet prvkov (stĺpcov)!

Príklad 3.2: Vytvorenie riadkového vektora
>> v1=[2 0.1 -3.7 4/5 0.14];
% alebo
>> u1=[2,.1, -3.7, 4/5,0.14];
Príklad 3.3: Vytvorenie stĺpcového vektora
>> v2=[2; 0.1; -3.7; 4/5; 0.14];
Príklad 3.4: Vytvorenie matice 3x2
>> A=[1 2; 0.1 -3; .7 1/4]
A =
    1.0000    2.0000
    0.1000   -3.0000
    0.7000    0.2500

Poznámka: príkazom priradenia je možné zmeniť hodnoty už existujúcich premenných.

Príklad 3.5: Zmena hodnoty premennej
>> u1
u1 =
    2.0000    0.1000   -3.7000    0.8000    0.1400

>> u1=[1 -3 2];
>> u1
u1 =
     1    -3     2

Zobrazenie hodnoty premennej

Ak chceme zistiť obsah premennej (jej hodnotu), môžeme použiť buď okno Workspace (dvojklik), alebo v dialógovom režime napíšeme názov premennej.
Príklad 3.6: Zobrazenie hodnoty matice A
>> A
A =
    1.0000    2.0000
    0.1000   -3.0000
    0.7000    0.2500

Vymazanie premennej

Premenné, ktoré už nie sú potrebné, možno vymazať s použitím okna Workspace, resp. pomocou príkazu clear.

Príklad 3.7: Vymazanie premennej
>> clear b a   % vymaže premennú b a premennú a
>> clear       % vymaže všetky premenné

Ak nie je uvedený zoznam premenných, potom sa budú vymazané všetky premenné z Workspace.

Preddefinované premenné

Niektoré premenné sú už definované systémom MATLAB:

Ak budú použité názvy preddefinovaných premenných pri vytváraní vlastných premenných, potom ich preddefinovaná hodnota sa zruší, ale po použití príkazu clear sa preddefinované premenné vrátia do pôvodného stavu.

Príklad 3.8: Predefinovanie preddefinovanej premennej
>> i
ans =
        0 + 1.0000i
>> i=7
i =
     7
>> clear i
>> i
ans =
        0 + 1.0000i

Premenná ans

Premenná ans je vytvorená automaticky, pokiaľ niektorý z príkazov potrebuje vypísať hodnotu, ktorú sme nepriradili do žiadnej premennej. Premenná ans teda obsahuje poslednú zobrazenú nepomenovanú hodnotu.

Príklad 3.9: Premenná ans
>> 2*3-5
ans =
     1
>> 2*3+5;
>> ans
ans =
    11

Načítanie a uloženie premenných v pracovnom priestore

Niekedy je potrebné uchovať niektoré dôležité premenné pre použitie pri budúcom spustení MATLABu (napr. pri prerušení prace). Potrebujeme teda premennú dostať z pamäti na disk počítača.

Na uloženie a načítanie premenných v pracovnom priestore MATLABu je možné použiť príkazy save a load. Syntax príkazu save je nasledovná:

Príkaz save ukladá premenné prac. priestoru do binárneho MAT-súboru, ktorý je možné spätné čítať s príkazom load.

Špecifikácia formátu súboru

Funkcia Opis
-mat využíva binárny formát M-súboru
-ascii využíva 8-bitový ASCII formát
-ascii -double využíva 16-bitový ASCII formát
-ascii -double -tabs oddeľuje prvky tabulátorom
-v4 ukladá do formátu MATLAB verzia 4
-append pripojí údaje do existujúceho MAT-súboru
Príklad 3.10:
% uloženie všetkých premenných prac. priestoru do súboru premen1.mat
>> save premen1

% uloženie premenných x, y, z do súboru premen2.mat
>> save premen2 x y z
Príklad 3.11:
% Načítanie premenných z disku (súbor premen1.mat) do prac. priestoru 
>> load premen1

% Načítanie premenných z disku, ak má súbor inú koncovku ako .mat 
% (súbor nazov.dat uložený v binárnom formáte)
>> load nazov.dat -mat

% Načítanie údajov z ASCII súboru
>> load pokus.dat
% v prac. priestore sa vytvorí premenná pokus 
Príklad 3.12: Uloženie údajov v ascii formáte
% predpoklad: ukladané údaje musia byť v tvare matice
>> A = [1 2;4 1];
>> save data.dat -ascii

% Vymazanie premenných z pamäte
>> clear

% Zobrazenie obsahu pamäte
>> who
  
% Načítanie premenných zo súboru 
>> load data.dat

% Zobrazenie obsahu pamäte
>> whos
  Name       Size                   Bytes  Class
  data       2x2                       32  double array
Grand total is 4 elements using 32 bytes

3.1.3. Špeciálne premenné a konštanty

PremennáOpis
ansautomatická premenná na odpoveď
computerpremenná počítačového typu
epsrelatívna presnosť (2.2204e-016)
i,jimaginárne operátory
infvýsledok je infinitív
NaNnie je číslo, neexistuje daná operácia (Not-a-Number)
narginvstupné číslo do funkcie
nargoutvýstupné číslo z funkcie
whyúspešná odpoveď
versiončíslo verzie MATLABu
pipi = 3.1415926...
realmaxnajväčšie reálne číslo 1.7977e+308
realminnajmenšie reálne číslo 2.2251e-308
Príklad 3.13: Delenie nulou
>> 12/0
Warning: Divide by zero.
ans =
   Inf
Príklad 3.14: Zistenie OS
>> computer
ans =
PCWIN
Príklad 3.15: Výsledok nie je číslo
>> 0/0
ans =
   NaN
Príklad 3.16:
>> why
Pete wanted it that way.
>> why
I told me to.
>> why
A young kid told me to.
>> why
Bill insisted on it.
>> why
For the love of Jack.
top

3.2. Výrazy

Výraz je postupnosť konštánt, názvov premenných, operátorov a volaní funkcií. Pokiaľ je výraz správny, potom po stisku klávesy ENTER je ihneď vyhodnotený. Vyhodnotením výrazu vzniká vždy nejaká hodnota. Výsledná hodnota výrazu môže byť uložená do premennej, alebo je uložená do premennej ans.

Pokiaľ nie je potrebné zobrazovať vypočítanú hodnotu, môže byť jej zobrazenie potlačené - za výrazom je napísaná bodkočiarka. Bodkočiarka teda okrem delenia riadkov matice slúži tiež k potlačeniu výpisu výsledku výrazu. Obvykle sa pri potlačenom výpise výsledku používa priradenie hodnoty výrazu do premennej, pretože inak vypočítaná hodnota zanikne.

3.2.1. Zápis dlhého výrazu v príkazovom riadku

Ak nie je možné výraz kvôli jeho dĺžke zapísať do jedného riadku, môžeme použiť zápis s tromi bodkami (...) na konci riadku, ktoré značia pokračovanie na ďalšom riadku. Tri bodky sa zvýrazňujú modrou farbou a znamenajú, že MATLAB má počkať s vykonaním príkazu, pretože ešte nie je celý. Pokiaľ MATLAB čaká na dokončenie príkazu, tak príkazový riadok nezačína >>.

Príklad 3.17: Zápis dlhého výrazu
>> s = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 ...
      - 1/8 + 1/9 - 1/10 + 1/11 - 1/12;

>> A = [1.5 -3 4.1; 2...
1.14 5 0.2; 7 15.1 8/31 0];

>> A = [1.5 -3 4.1; 2...
1.14 5 0.2; 7 15.1...
8/31 0];

3.2.2. Ukončenie vykonávania príkazu

Príkaz, ktorý sa práve vykonáva, môže byť ukončený pomocou klávesovej skratky CTRL+C. Väčšinou sa CTRL+C používa v prípadoch nekonečného cyklu alebo výpisu príliš veľkej matice.

3.2.3. Viac výrazov na jednom riadku

Doteraz boli príkazy ukončované pomocou klávesy ENTER, ktorá zároveň odoslala príkaz k spracovaniu. Občas je ale potrebné odoslať k spracovaniu viac príkazov naraz. V takomto prípade môžu byť použité buď M-súbory, alebo zápis viac príkazov na jeden riadok, pričom na oddelenie jednotlivých príkazov sa používa čiarka alebo bodkočiarka (čiarka iba oddeľuje príkazy, bodkočiarka navyše potlačuje výpis ich výsledkov).

Príklad 3.18: Tri výrazy na jednom riadku
>> m=8, n=3; vysledok=3*m+0.5*n
m =
     8
vysledok =
   25.5000
top

3.3. Reťazce

Reťazce (anglicky character arrays alebo strings) sú v podstate vektory, ktoré obsahujú znaky anglickej abecedy. Nedoporučuje sa používať slovenské znaky obsahujúce diakritiku, pretože býva problém s ich správnym zobrazovaním.

3.3.1. Vytváranie reťazca

Na vytvorenie reťazca slúžia apostrofy, do ktorých sa zapisuje obsah reťazca (napríklad 'text' alebo 'Toto je dlhy text.'), pričom takto vytvorený reťazec môže byť uložený do premennej:

Príklad 3.19: Vytvorenie reťazca
>> text = 'lubovolny text'
text =
lubovolny text
>> nazov = 'text s diakritikou = ľubovoľný text'
nazov =
text s diakritikou = ľubovoľný text

Vo Workspace sa reťazec objaví ako premenná typu char array (doteraz boli používané iba čísla - double array).

Poznámka: reťazce možno ukladať aj do matíc, ale je nutné, aby všetky riadky (= reťazce) mali rovnakú dĺžku! Doplňuje sa väčšinou medzerami.

Príklad 3.20: Matica reťazcov
>> mena = ['Ivan '; 'Jana '; 'Peter'; 'Eva  '; 'Ivan ']
mena =
Ivan 
Jana 
Peter
Eva  
Ivan 
Príklad 3.21: Matica reťazcov - chybné zadanie
>> mena = ['Eva'; 'Ivan']
??? Error using ==> vertcat
All rows in the bracketed expression must have the same 
number of columns.

3.3.2. Výpis reťazca

Pokiaľ máme reťazec uložený v premennej, môže byť vypísaný rovnakým spôsobom ako obsah číselnej preomennej, teda zadaním názvu premennej.

Existujú tiež funkcie, ktoré vypisujú zadaný reťazec, a to funkcia disp(), ktorá má jeden argument. Argumentom môže byť text alebo názov premennej.

Príklad 3.22:
>> disp('ahoj')
ahoj

>> disp(text)
lubovolny text

Ďalšou funkciou vypisujúcou zadaný reťazec je funkcia error(), ktorej argumentom je chybové hlásenie (vypisuje sa červenou farbou). Táto funkcia navyše ukončuje vykonávanie aktuálneho príkazu (preto sa používa vnútri funkcií a skriptov).

Príklad 3.23: Výpis chybového hlásenia
>> error('Chyba')
??? Chyba

Poznámka: keďže je reťazec vektor zložený zo znakov, môže sa s ním pracovať znak po znaku. Ďalšou možnosťou je využiť funkcie MATLABu, ktoré ponúkajú porovnávanie reťazca (napr. funkcia strcmp), prevod na veľké alebo malé písmená (upper a lower), konverzia reťazca na čísla a naopak (napr. str2num a num2str) , atď. (viac: help strfun).

top

3.4. Komentáre (poznámky)

Komentáre slúžia väčšinou k vysvetleniu významu jednotlivých príkazov, skriptov alebo funkcií. Komentáre pri užívateľských funkcia navyše slúžia ako nápoveda, ktorú vie MATLAB zobrazovať napr. príkazom help názov (jedná sa o komentáre definované na začiatku skriptov).

Komentár začína znakom % a končí spolu s koncom riadku. Text komentára býva označený zelenou farbou (pokiaľ nie je zvolená iná farba).

Všetky komentáre sú MATLABom ignorovaní, t.j. nie sú vyhodnocované.

Príklad 3.24: Komentár
>> x = 10; % Vytvorenie premennej x, bez výpisu
top

3.5. Operátory a špeciálne znaky

Operátory v MATLABe môžeme rozdeliť do troch základných skupín:

Operátory, ktoré nie je možné začleniť do žiadnej skupiny sa nazývajú špeciálne znaky. V MATLABe je možné využívať nasledovné operátory a špeciálne znaky:

Znak Opis Znak Opis
+ plus ... pokračovanie
- mínus ; bodkočiarka
* maticové násobenie , čiarka
.* násobenie prvkov % komentár
^ umocnenie ! výkričník
.^ umocnenie prvkov ' transpozícia
Kron násobenie Kronecker .'  
\ ľavé delenie = priradenie
/ pravé delenie == zhodnosť
./ pravé delenie prvkov <> relačné operátory
: dvojbodka & logický AND
[] hranaté zátvorky | logický OR
() okrúhle zátvorky ~ logická negácia
. desatinná bodka XOR log. exclusive OR
.. rodičovský adresár    

3.5.1. Aritmetické operátory

Unárne

Názov Syntax Opis
unárny plus +a1
unárny mínus -a1
transpozícia a konjugovanosť a1'
transpozícia a1.'

Binárne

Názov Syntax Opis
sčítanie a1+a2
odčítanie a1-a2
násobenie matíc a1*a2
násobenie po prvkoch a1.*a2
umocnenie matice a1^a2
umocnenie po prvkoch a1.^a2
delenie matíc a1/a2
delenie po prvkoch a1./a2
delenie matíc zľava a1\a2
delenie po prvkoch zľava a1.\a2

Dvojbodka

Názov Syntax Opis
vytváranie aritmetických postupností i:k:j
i:j
  • všetky argumenty musia byť skaláry
  • vytvorí aritmetickú postupnosť od i do j s krokom k, t.j. [i i+k i+2k ... j] (v prípade, že (j-i)/k nie je celé číslo, potom posledný člen nie je j, ale číslo menšie (maximálne o k-1))
  • ak nie je definované k, potom je krok automaticky zvolený ako 1, teda i:j generuje postupnosť [i i+1 i+2 ... j]
  • ak je krok chybne zvolený (nedá sa dostať od i k j), potom je výsledkom prázdna matica

3.5.2. Relačné operátory

Názov Syntax Opis
menší <
  • vykonávajú sa po prvkoch
  • argumenty musia mať rovnaké rozmery alebo aspoň jeden z nich je skalár
  • výsledok má rozmer ako neskalárny argument (alebo je to skalár)
  • výsledok obsahuje iba nuly (nepravda, false) a jednotky (pravda, true) podľa toho, či je príslušná relácia medzi argumentmi pravdivá
  • pokiaľ je jeden z argumentov skalár, porovnáva sa s ním každý prvok druhého argumentu
menší alebo rovný <=
väčší >
väčší alebo rovný >=
rovnajúci sa ==
nerovnajúci sa ~=

Upozornenie: je veľký rozdiel medzi == (porovnanie) a = (priradenie).

Príklad 3.25: Rozdiel medzi priradením a porovnaním
>> a = 2
a =
     2

>> a == 2
ans =
     1

Poznámka: relačné operátory sa využívajú najmä v príkazoch cyklenia a vetvenia (if, for, while, switch).

Príklad 3.26:
A=[2 7 6;9 0 -1;3 1 6];
B=[8 0.2 0;-3 2 5;4 -1 7];
A < B
ans =
     1     0     0
     0     1     1
     1     0     1

3.5.3. Logické operátory

Unárne

Názov Syntax Opis
negácia ~a1
  • aplikuje sa na každý prvok a1
  • výsledok má rozmer ako a1
  • výsledok obsahuje iba nuly a jednotky

Nasledujúca tabuľka zobrazuje možné stavy dosiahnuté negáciou.

Negácia
a1~a1
nenulové0
01

Binárne

Názov Syntax Opis
logický súčin a1&a2
  • aplikuje sa na každý prvok a1
  • výsledok má rozmer ako a1
  • výsledok obsahuje iba nuly a jednotky
logický súčet a1|a2

Nasledujúca tabuľka zobrazuje možné stavy dosiahnuté logickým súčinom a súčtom.

Logický súčin a súčet
a1a2a1&a2a1|a2
nenulovénenulové11
nenulové001
0nenulové01
0000

Príklad 3.27:
a = [1 0 4 2 0 5];
b = [5 3 1 0 0 7];
% operácia AND
a & b
ans =
     1     0     1     0     0     1

% operácia OR
a | b
ans =
     1     1     1     1     0     1

% operácia NOT
~ b
ans =
     0     0     0     1     1     0

3.5.4. Priorita operátorov

Poradie, v akom sa budú jednotlivé časti výrazu vyhodnocovať, môžeme podľa potreby zadať tým, že použijeme guľaté zátvorky na ohraničenie všetkých potrebných častí výrazu. Nie vždy sú zátvorky potrebné, pretože každý z vyššie uvedených operátorov má pevne dané poradie vyhodnocovania (prioritu). Operátory v tabuľke sú zoradené zhora dolu podľa klesajúcej priority.

Postupnosť pravidiel vyhodnocovania aritmetických operátorov:

Priorita Operátor Poznámka
1.()zátvorky
2..', .^, ', ^transpozícia, umocnenie, transpozícia+konjugovanosť, maticové umocnenie
3.+, -, ~unárny plus, unárny mínus, negácia
4..*, ./, .\, *, /, \násobenie po prvkoch, delenie po prvkoch, delenie po prvkoch zľava, násobenie matíc, delenie matíc, delenie matíc zľava
5.+, -sčítanie, odčítanie
6.:dvojbodka
7.<<=>>===~=relačné operátory
8.&logický súčin, AND
9.|logický súčet, OR

Operátory sú vyhodnocované zľava doprava.

3.5.5. Logické funkcie

Príkaz Opis
all pravda ak všetky prvky vektora sú pravdivé
any pravda ak žiadny prvok vektora nie je pravdivý
exist kontroluje, kde existujú premenné alebo funkcie
find hľadá prvky, kde výraz je pravdivý
finite pravda pre konečné prvky
isempty pravda pre prázdnu maticu
isieee pravda pre IEEE floating point aritmetiku
isinf pravda ak prvok je infinitív
isnan pravda ak prvok nie je číslo
issparse pravda pre sparse maticu
isstr pravda pre textový reťazec
Príklad 3.28:
% reťazec alebo infinitív
a = [1 -2000 3 inf 89];
b = ['hello' 'ciao' 'inf'];
isstr(a)
ans =
     0
isstr(b)
ans =
     1
isinf(a)
ans =
     0 0 0 1 0
isinf(b)
ans =
     0 0 0 0 0 0 0 0 0 0 0 0

% funkcia XOR
a = [1 0 4 2 0 5];
b = [5 3 1 0 0 7];
xor(a,b)
ans =
     0 1 0 1 0 0

% stĺpce s nenulovými prvkami
A = [0 1 2 5;3 4 0 7];
all(A)
ans =
     0 1 0 1
Príklad 3.29:
% Delenie prvkov vektorov y a x nastane, 
% ak všetky prvky vektora x sú nenulové
if all(x)
  d = y./x
end
top

3.6. Úlohy

  1. Vytvorte si premenné a=-2, b=2, c=1.5 a vypočítajte hodnoty výrazov:
  2. Pre vektory e=[2,4,1,12,0,5], f=[0,8,6,3,10,7] vykonajte:
    • relačné operácie e<f, e>f
    • logické operácie AND, OR s vektormi e, f
  3. Zistite všetky prvky vektora f, ktoré sú z intervalu (5, 10)
  4. Vyskúšajte zápisy niektorých špeciálnych premenných a konštánt:
    • zapíšte komplexné čísla 5i, 3+4pi.i, 2/3pi.i
    • podeľte nejaké číslo nulou
  5. Vykonajte nasledujúce úkony (dodržujte poradie):
    • uložte premenné a, b, c z prac. priestoru do binárneho mat-súboru data1.mat
    • uložte premennú e z prac. priestoru do dátového ascii-súboru data2.dat
    • uložte premenné e, f z prac. priestoru do binárneho mat-súboru data3.txt
    • vymažte prac. priestor MATLABu (Workspace)
    • načítajte premenné z uloženého súboru data1.mat
    • v Command Window zobrazte zoznam premenných
    • načítajte premenné z uloženého súboru data2.dat
    • v Command Window zobrazte zoznam premenných
    • vytvorte nové premenné a1, b1, c1 ktoré budú obsahovať hodnoty premenných a, b, c.
    • vymažte premenné a, b, c z prac. priestoru
    • načítajte premenné z uloženého súboru data3.txt
    • v Command Window zobrazte zoznam premenných
top