%% Jednoduchý úvod do MATABu II
% Pokračovanie z minulého cvičenia.
%%
% Vyčistíme si priestor premenných
clear
%% Riedke matice
% Pre matice, ktoré majú málo nenulových prvkov je vhodnejšia reprezentácia
% pomocou tzv. riedkych matíc. V pamäti sú potom uložené iba indexy a
% hodnoty nenulových prvkov. V nasledujúcom príklade je |A| hustá matica a |B| je jej riedka
% verzia:
A=[ 0 2 0; 1 0 0; 0 0 5]
%%
B=sparse(A)
%%
whos
%%
% S riedkymi maticami je možné počítať úplne rovnako ako s hustými maticami
% a vo výrazoch sa obidve reprezentácie matíc môžu ľubovoľne miešať:
C=3*B
%%
D=A+B
%%
% Tiež je možné "vynútiť" si zmenu reprezentácie matice na hustú ("plnú"):
E=full(B)
%%
% Funkcií generujúcich riedke matice je viacej (napr. |speye(n)|, viz. nápoveda), ale
% nebudeme ich potrebovať.
%% Štruktúry
% štruktúry zodpovedajú C-kovej |struct|, ale bez deklarovania zložiek.
% Položky záznamu sa označujú bodkovou notáciou.
a.x=8
%%
a.y=9
%%
sqrt(a.x^2+a.y^2)
%%
whos
%%
fieldnames(a)
%% Bunkové polia (cell arrays)
% Matica ($n$-rozmerné pole) v MATLABe je homogénne v zmysle, že všetky
% prvky poľa majú rovnaký typ. To znemožňuje vložiť do poľa prvky rôznych
% typov. Presne toto však umožňujú bunkové polia. Na rozdiel od
% štandardných polí sa zapisujú do zložených zátvoriek a aj ich indexy sa
% píšu do zložených zátvoriek:
A = {1 [3;2] [1 2; 3 4]}
%%
A{2}
%%
whos 
%%
% MATLAB umožňuje (na rozdiel od Octave) definovať triedy a programovať
% pomocou prostriedkov objektovo orientovaného programovania (viz |help
% class|). Ale zatiaľ nebudeme potrebovať

%% Programovanie v MATLABe
% MATLAB je jazyk orientovaný na výrazy. Zadávané výrazy sú interpretom
% rovno vyhodnocované ako príkazy. Príkaz má teda tvar
%
% _premenná_ = _výraz_
%
% alebo priamo
% 
% _výraz_

%%
% Na jednom riadku môže byť viacej príkazov oddelených čiarkami alebo
% stredníkmi. Výraz zakončený stredníkom je vyhodnotený, ale jeho hodnota
% sa nevypíše. To sa používa v programoch na to, aby neboli vypisované
% všetky medzivýsledky výpočtov.
b=eye(3); c = 2*b; d = c^4+b
%%
% Programové konštrukcie ako napr. cyckly je možné používať i v
% interaktívnom režime, ale obvyklejšie je použitie v skriptoch
% (programoch). Je možné používať cykly |for|.
for I = 1:10
    fprintf('%d^2 = %d\n',I,I*I)
end
%%
% Príbuzný |while| cyklus je tiež možný
I=1;
while I<=10
    x=[I,I*I]
    I=I+1;
end
%%
% Podmienený príkaz má obecný tvar
%
% |if| _podmienka_
%
%     príkazy
%
% |elseif| _podmienka_
%
%    príkazy
%
% ...
%
% |else|
%
%    príkazy
%
% |end|
I = 6;
if I<2
    disp('Je to málo')
elseif I<10
    disp('Je to akurát')
else
    disp('To je už príliš mnoho')
end
%%
% Relačné operátory MATLABu sú
%
% * <     menší
% * >     väčší
% * <=    menší alebo rovný
% * >=    väčší alebo rovný
% * ==    rovná sa
% * ~=    nerovná sa
%
% Podmienky sa môžu spojovať pomocou logických spojok
%
% * &     a (and)
% * |     alebo (or)
% * ~     negácia (not)
x = randn(1)
%%
if -1<x & x<1
    disp('Skoro nula')
end
%%
% *Pozor na porovnávanie matíc!* Ak chceme vykonať príkaz v prípade, že sa
% matice |A| a |B| rovnajú:
A = rand(2);
B = A;
if A==B
    disp('Sú rovnaké')
end
%%
% Ale stačí malý rozdiel a ...
A(1,1)=2
B(1,1)=sqrt(2)^2;
if A==B
    disp('Sú rovnaké')
else
    disp('Sú rôzne')
end
%%
% Správne porovnanie matíc reálnych čísel:
tol=0.00001
if abs(A-B)<abs(A)*tol
    disp('Sú rovnaké')
else
    disp('Sú rôzne')
end
%%
% Pozor na test nerovnosti matíc
if A~=B
    disp('Sú rôzne')
else
    disp('Sú rovnaké')
end
%%
% Test |A~=B| vráti maticu núl a jedničiek. 
T = A~=B
if T
    disp('Sú rôzne')
else
    disp('Sú rovnaké')
end
%%
% Podmienka |if T| otestuje nenulovosť matice |T|! Správne sa buď využije
% funkcia |any|, ktorá pre vektor vráti 1, ak aspoň jedna z jeho zložiek je
% nenulová, a pre maticu vráti riadkový vektor výsledkov zodpovedajúcich
% aplikácii |any| na každý stĺpec.
if any(any(A~=B))
    disp('Sú rôzne')
end
%%
% Alebo jednoduchšie
if A==B else
    disp('Sú rôzne')
end
%%
% Na redukciu matíc na vektory a skaláry sa dá tiež využiť funkcia |all| -
% viz nápoveda.

%% Programy v MATLABe
% Programy v MATLABe sa nazývajú m-súbory (majú príponu .m) a používajú sa
% 
% # buď ako skripty
% # alebo ako funkcie.
% 
%% Skript 
% obsahuje postupnosť príkazov, ktoré majú byť vykonané. Ak má meno |XX.m|,
% tak sa zavolá príkazom |XX|. Všetky premenné, ktoré sa v ňom vyskytujú
% sú globálne. Dá sa použiť napr. na inicializáciu premenných alebo na
% zápis nejakého výpočtu.
%% Funkčný m-súbor
% obsahuje deklaráciu práve jednej funkcie. Meno deklarovanej funkcie musí
% súhlasiť s menom súboru. Prvý riadok súboru musí obsahovať hlavičku tejto
% funkcie v tvare
%
% |function vysledok = XX(par1,par2,...,parN)|
%
% |vysledok| je premenná, do ktorej bude uložená návratová hodnota.
% |par1, ..., parN| sú parametre funkcie. Ich typ sa neuvádza.
% 
% Príklad je v súbore GenMat.m