%% Jednoduchý úvod do MATABu
% Názov je skratka MATrix LABoratory
% Program navrhnutý na maticové výpoèty pred viac než 20 rokmi
%% 
% 
%  Hlavné použitie programu:
% 
% * riešenie sústav lineárnych rovníc
% * poèítanie vlastných èísel, vlastných vektorov
% * faktorizácia matíc
% * bohaté grafické možnosti
% * vlastný programovací jazyk
% * navrhnutý na numerické riešenie - nie symbolické (ale už tiež umožòuje
% pomocou špecializovaných balíkov - Toolboxov)
%% 
% Absolútna väèšina funkcií MATLABu je implementovaná v |GNU Octave|.
% |Octave| je vo¾ne šírite¾né vo verziách pre Unix (Linux) i pre Windows.
% Nemá grafické IDE. Nemá toolboxy. Kreslenie grafov nie je v |Octave|
% integrované. Typicky sa rieši pomocou |GNU Plot|.
%% Jednoduché výpoèty
% Ako vklada� èísla, vektory a matice a základné výpoèty s nimi.
% 
% Základným dátovým typom sú n-rozmerné polia (primárne dvojrozmerné -
% matice) reálnych èísel. Zapisujú sa do hranatých zátvoriek. Odde¾ovaèom
% sú medzery, tabelátory a èiarky v riadkoch, stredníky a znaky konca riadku
% odde¾ujú riadky. Najprv vektory - riadkový |x| a ståpcový |y|. Ich súèinom je
% matica.
x=[2,3,4]
%%
y=[1;2]
%%
z=y*x

%% 
%  Vloženie matice
% 
% * na jednom riadku, alebo
% * na viacerých riadkoch
A=[2.3  4.8 9.2; 21.34 1.3e12 9] 
%%
% Pri výpise matice |A| je pred maticou vypísaný spoloèný koeficient
% |1.0e+012 *|, ktorým majú by� vynásobené všetky prvky matice
B = [ 1 9 23
        21 2 1
        9 11 99]
%%
% Skaláry sú matice s rozmermi |1x1|
a = 3.1
%%
u = a*z
%% 
% MATLAB rozlišuje ve¾ké a malé písmená. Premenné sa nedeklarujú. Zoznam
% definovaných premenných sa zistí príkazom |who|
who
%%
% Podrobnejšie informácie o premenných dá príkaz |whos| alebo okno
% *Workspace*
whos
%%
% Aritmetika MATLABu je "robustná"
nekonecno = a/0
%%
nula = 1 / nekonecno
%%
CoJeTo = nekonecno / nekonecno
%%
% Vydrží aj odmocòovanie záporných èísel
sqrt(-1)
%%
% MATLAB vie poèíta� s komplexnými èíslami. Imaginárna jednotka sa znaèí
% buï |i| alebo |j|
(1+2i)*(1-2j)
%%
% MATLAB je vlastne ve¾mi výkonná kalkulaèka. Výsledok posledného výrazu
% (neuloženého do premennej) je v premennej |ans|
% 
2^3
%%
2^4
%%
2^100
%%
20^3-3*23/8
%%
sqrt(ans)
%%
% Ovláda mnoho aritmetických, goniometrických a iných funkcií:
sin(4)
%%
sin(3*pi)+cos(1.23)^2
%%
log(2430)
%%
% Aký základ používa funkcia |log|? Pomôže nám nápoveda
help log
%%
% Dokonalejšia nápoveda je hypertextová nápoveda prístupná cez tlaèítko
% |Start > Help| alebo cez tlaèítko so znakom '?' v modrom krúžku na
% toolbare pod menu. O funkciách sa dá ¾ahko zisti� nápoveda cez tlaèítko _fx_ 
% ved¾a promptu v príkazovom okne *Command Window*. Ïalšími možnos�ami sú
% demo-videa a demo príklady.
%%
% 
% <<FuncHelp.jpg>>
% 
%% Aritmetické operácie s maticami
% Bežné aritmetické operácie ale i *delenie maticou*!
%
% *Štandardné operácie*
%
% Ak výraz konèí bodkoèiarkou ';', tak sa jeho výsledok nezobrazí.
% Sèítanie, odèítanie
A = [1 2 3; 2 3 1; 0 7 3];
B = [1 1 1; 3 2 1; 7 6 5];
C = [3 3; 3 3; 4 3];
whos
%%
A+B
%%
A-B
%%
% Príkaz A+C; spôsobí chybové hlásenie
% 
%  Error using ==> plus
%  Matrix dimensions must agree.
%
%  Error in ==> Uvod at 124
%
%%
% Maticové násobenie:
D = A*C
%%
A*B
%%
B
%%
% Násobenie skalárom:
3*B
%%
% Násobenie po zložkách |.*|:
A.*B
%%
% *Transpozícia matice*
%
% Pre maticu reálnych èísel |A| je |A'| transponovaná matica k matici |A|.
A = [ 1 2 3; 4 5 6]
%%
A'
%%
% V skutoènosti je |A'| matica (komplexne) konjugovaná k matici |A|, to
% znamená, že ak |A| obsahuje komplexné èísla s nenulovou imaginárnou
% èas�ou, tak po transpozícii sú u imaginárnych èastí opaèné znamienka
B = A+i*(rand(2,3)-0.5)
%%
B'
%%
% Ak aj v prípade komplexných èísel potrebujeme iba transponovanú maticu
% bez zmeny znamienok, tak sa pred apostrof vloží bodka:
B.'
%%
% *Generovanie matíc*
%
% |zeros(m,n)| je nulová matica _mxn_
zeros(2,3)
%%
% |ones(m,n)| je matica _mxn_ obsahujúca samé jednièky
ones(2,3)
%%
% |eye(n)| je jednotková matica _nxn_
eye(3)
%%
% |diag(v)| je diagonálna matica, ktorá je nulová a na diagonále sú prvky z
% vektora |v|
diag([1,2,3])
%%

%%
% *Riešenie sústavy lineárnych rovníc "delením maticou"*
%
% Ak matica _A_ nie je singulárna, tak sústava rovníc 
% 
% $$Ax=b$$ 
%
% má riešenie
%
% $$x=A^{-1}b$$
%
% V MATLABe je na to operátor "delenia z¾ava" vo forma
% opaèného lomítka. Najprv vygenerujeme náhodnú maticu _A_
A=rand(3,3)
%%
% Náhodný vektor _b_
b=rand(3,1)
%%
% Potom sústavu 
%
% $$Ax=b$$ 
% 
% vyriešime:
x=A\b
%%
% Výsledok (získaný iteratívnou numerickou metódou) skontrolujeme:
A*x-b
%% Generovanie vektorov
% Pre rôzne úèely sú èasto treba vektory reprezentujúce lineárne a iné typy postupností.
%
% Rastúca postupnos� celých èísel od |A| do |B| sa vygeneruje zápisom
% |A:B|
t = 1:6
%%
% Jedná sa o aritmetickú postupnos�, ve¾kos� kroku môže by� ¾ubovo¾ná 
% Napríklad postupnos� od |A| do |B| s krokom |Krok| sa zapíše ako |A:Krok:B|
t=-1:0.2:1
%%
% Aj negatívny krok je možný
t = 20:-3:1
%%
% Podobne funguje funkcia |linspace(A,B,N)|, ktorá vráti |N| èísel, ktoré
% interval 
% 
% $$<A,B>$$ 
%
% rozdelia rovnomerne na |N-1| dielikov.
linspace(0,1,11)
%%
% Logaritmickú postupnos� medzi |10^A| a |10^B| generuje funkcia |logspace(A,B,N)|
logspace(1,6,7)
%% Vektorizované funkcie
% Pokia¾ je to zmysluplné, tak všetky funkcie v MATLABe sú tzv.
% vektorizované. To znamená, že je možné im ako argument da� vektor a
% výsledkom bude aplikácia funkcie na každý prvok vektora.
% Napríklad tabu¾ka funkcie _sin(2t)_ na intervale
%
% $$ <0 ,\pi>$$
 t = 0:0.1:pi
 %%
tab = sin(2*t)
%% 
% Graf tejto funkcie potom môžeme jednoducho zobrazi�
plot(t,tab)
%%
% Pozor na násobenie a umocòovanie. Typicky potrebujeme výpoèet po
% zložkách. Príklad: výpoèet funkcie
%
% $$1/(1+x^2)$$
x = -2:0.1:2;
y = 1./(1+x.^2);
plot(x,y)
%% Kreslenie grafov
% MATLAB umožòuje kresli� 2D i 3D grafy.
% Už sme videli kreslenie 2D grafu pomocou funkcie |plot(x,y)|. Táto funkcia je
% rozšírená. Tretí parameter udáva paremetre zobrazenia grafu.
% Napríklad farbu grafu - èervený graf:
plot(x,y,'r')
%%
% Zelený graf èiarkovaný:
plot(x,y,'g--')
%%
% Bez spojovania zobrazených bodov. Body v tvare krúžkov:
plot(x,y,'o')
%%
% Bez spojovania zobrazených bodov. Body v tvare krížikov:
plot(x,y,'+')
%%
% Ïalšie možnosti viz nápoveda funkcie |plot|.
%
% Popisy grafu je možné meni�.
% |xlabel('string')| a |ylabel('string')| zmenia popisy x-ovej a y-ovej osy
% grafu.
xlabel('x hodnoty');
ylabel('1/(1+x^2)');
plot(x,y)
%% 
% |grid| pridá do grafu pravouhlú mriežku.
% |hold on| "podrží" graf a dovolí pridáva� do obrázku grafy ïalších
% funkcií
hold on
plot(x,sin(x))
%%
% |hold off| ukonèí "držanie" grafu.
hold off
%%
% Viacej grafov je možné nakresli� aj pridaním ïalších parametrov do
% volania |plot|.
plot(x,y,'r+--',x,sin(x),'go:')
%% Ïalšie užitoèné príkazy
% |max(x)| v prípade, že |x| je vektor, tak je to jeho maximálny prvok. Ak
% je |x| matica, tak vráti maximálne prvky v jednotlivých ståpcoch. Ïalšie
% možnosti sú popísané v nápovede.
x
%%
max([2, -33.1,14,9])
%%
A
%%
max(A)
%%
% Podobne funguje |min(x)|.
%
% |abs(x)| poèíta absolútnu hodnotu prvkov z |x|.
abs([1, -3,-4, 2])
%%
% |size(x)| vráti vektor s rozmermi matice |x| v jednotlivých dimenziách
size(D)
%%
% |length(x)| vráti "dåžku" po¾a |x|, tj. |max(size(x))|.
length(D)
%%
% |save fname| uloží stav všetkých definovaných premenných do súboru
% |fname.mat|
%  save 'c:\MatLab\Tst.mat'
%%
% |save fname var1 var2| uloží iba obsahy vymenovaných premenných
%
% |load fname| naèíta obsah premenných zo súboru |fname.mat|.
%
% |quit| ukonèí MATLAB
%% Práca s prvkami matíc
C
%%
C(2,1)
%%
% Druhý riadok matice |C|
C(2,:)
%%
% Druhý a tretí riadok matice |C|
C(2:3,:)
%%
% Prvý ståpec matice |C|
C(:,1)
%%
% Vybrané prvky vektora
x=0:2:14
%%
idx = [ 3 1 4];
x(idx)
%%
% Takéto indexovanie je možné využi� i na zmenu prvkov v matici (vektore)
x(idx)=[1,2,3]
%% Formát výstupu
% Štandardne MATLAB vypisuje èísla na obmedzený poèet platných èíslic (5) a
% medzi riadky výstupu vkladá èasto prázdne riadky. To sa dá zmeni�. Väèší
% poèet platných èíslic získame príkazom
format long
A
%%
% Je možné si vynúti� exponenciálny tvar zápisu èísel
format long e
A
%%
% Alebo krátky zápis v exponenciálnom tvare
format short e
A
%%
% Alebo krátky zápis bez vynúteného exponenciálneho tvaru - ak je to nutné,
% tak sa exponenciálny tvar použije, inak nie
format short
A
%%
% Ale za najužitoènejšie považujem možnos� vynecha� zbytoèné prázdne riadky
% na výstupe a výstup "skompaktni�"
format compact
A
%% Ïalšie možnosti - budú predstavené na ïalšom cvièení
% 
% * programovanie v MATLABe
% * riedke matice
% * štruktúry
% * bunkové polia (cell arrays)
% 
%% Úloha
% Nakreslite "žblunknutie kameòa do vody" ako 3D-graf funkcie dvoch
% premenných. Vlny by sa mohli poèíta� ako |sin(|_vzdialenos� od poèiatku
% súradníc_|)|. So vzdialenos�ou od poèiatku súradníc by výška vån mala klesa�.






