% 1. Cviceni BIOMETRIE
%
% pripraveno na motivy Help souboru Matlabu
% Vychazi ze skriptu Vitka Zyky a Hynka Baksteina a textu pro predmet
% X33ROB
%
% The MathWorks Inc. (http://www.mathworks.com/)
% MATrix LABoratory

% Obsah :
%  - Uvod do matlabu
%  - Zpusob prace a napoveda
%  - Matice, konstanty, jednoduche vypocty
%  - Indexovani matic
%  - Programove konstrukce
%  - Proc nepouzivat cyklus

%%% Uvod--------------------------------------------------------------
% Matlab :
% - numericke vypocty, analyzy; symbolicke vypocty
% - uplny programovaci jazyk, casti v C/C++, Fortanu
% - blokove simulace (Simulink)
% - vizualizace 1D, 2D, 3D dat, obrazky, video, 3D objekty
% - jednoducha GUI

% Efektivita programovani:
%  + silna oborova podpora
%    (toolboxy: http://www.mathworks.com/products/products_by_category.jsp
%     real time, image processing, optimalizations, neural networks,
%     signal processing, splines, wavelet, statistics, mapping,
%     symbolic computations, video)
%  - interpretovany kod
%  + debugovani, profiler (html vystup)
%  + programovani v C/C++, Fortranu
% Ostatni:
%  - vysoka cena
% Zaver:
%  -> +++ vyvoj, vyzkum; - aplikace

% Zaklady -------------------------------------------------------------
% Prehled GUI:
% - command window
A = 1
% - workspace + variable editor
% - command history
% - current dir
% Prace s adresari ----------------------------------------------------

cd C:\users\krsek\rob06l\Source
cd('C:\users\krsek\rob06l\Source')
cd ..

ls
dir

%%% Jak ziskat napovedu -----------------------------------------------

help sum

doc sum % napoveda v prohlizeci

helpwin
helpdesk

lookfor fourier

%%% Zapis jednoduchych matic ------------------------------------------

% Vsechny promenne jsou matice. 
% Vektory a skalary jsou matice specialnich rozmeru.

% Vektory (rozlisuje mala a velka pismenka) 
F = [1,2,3] % carka oddeluje sloupce -> radkovy vektror
F = [1 2 3] % ekvivalentni predchozimu zapisu

f = [1;2;3] % strednik oddeluje radky -> sloupcovy vektor

% strednik na konci radku potlaci vypis
f = [2;3;4];

% Matice (pro prehlednost se hodi oddelovat carkou)
k = [9, 8, 7; 6, 5, 4; 3, 2, 1; 0 -1 -2]

l = [cos(0.5) - sin(0.5); sin(0.5) cos(0.5)]
L = [cos(0.5), -sin(0.5); sin(0.5), cos(0.5)]

K = [k  k+100; k+200  k+300] % spojovani bloku

% posloupnosti
1:6
1:2:6
.5:-.1:0

x = [1:5;2:6]

%%% Informace o promennych --------------------------------------------

size(k)
size(k,2) % promenna, cislo rozmeru
length(k)
whos

exist('k')

clear('K')

%%% Generovani jednoduchych matic -------------------------------------

Z1 = zeros(2,5) % pocet radku, pocet sloupcu
Z2 = ones(1,7)
Z3 = eye(3)
Z4 = diag([1 2 3 4 5])

%%% Specialni konstanty -------------------------------------------------

ans          % answer
inf          % 1/0 infinity
nan          % 0/0 not-a-number

isfinite
isnan

pi
i, j         % nepouzivat jako promenne, do cyklu radeji k,l,m ...

%%% Indexace matic, prevody ---------------------------------------------

% Prvni rozmer je vzdy radek, druhy sloupec

k
k(1,2)           % dva parametry -> (nespojite) souradnice (sub)
k(2,[2 3])
k(2,[1 3])
k(2,[1:3])
k(2,1:3)
k(2,1:end)
k(2,:)

k([1 4 5])         % jeden parametr -> fyzicka souradnice (ind)
k([1;4;5])
k([1 2;3 4;8 9])

k([2, 3],[3, 2])
k(sub2ind(size(k),[2 3],[3 2]))
ind2sub(size(k),[1 2;3 4;8 9])

kk = k;
kk(:,2) = []     % index vlevo + vypusteni nekterych sloupcu

k(:)             % prevod matice -> vektor

%%% Generovani nahodnych cisel ---------------------------------------

r1 = rand(1,1000); % rovnomerne rozdeleni
r2 = randn(100,100); % normalni rozdeleni
r3 = randi([5,50],10,10);

hist(r1)
hist(r2(:))
 
%%% Jednoduche vypocty -----------------------------------------------

%transpozice
L'
% nasobeni skalarem
p = 5 * k
% nasobeni matic:
s = k * k
% operace po prvcich
p .* k                 % .* .+ .- .^ ./

% deleni
% A*x = y
A = [2 -3; 3 1]
y = [1; 7]

x  = A\y    % deleni zleva     x  = pinv(A)*y
xa = y'/A   % deleni zprava    xa = y'*pinv(A)
xb = A/y'   % deleni zprava    xb = A*pinv(y')

%inverze
inv(L)

% relace
ki = k>5       % ==  ~=  >  <  <=  >=  &  |  ~

% asociativni vyber prvku
find([1 0 -5])
ind = find(k>5)
[s u] = find(k>5)
k(ind)

kk = k;
kk(kk>5) = NaN

%%% Prace s maticemi -------------------------------------------------------

sum(A) % scita pres radky
sum(A')

sum(A,2) % scita pres zadany rozmer

min(A)
[u v] = max(A)
min(A(:))

%%% Programovaci konstrukce --------------------------------------------------
%for l = [1:5]
for l = [1,3,5,2]
  l
  a(l) = l^2;
end;
% i=1:20; a= i.^2;

% if
a = [1 2];
if( any(a>1) )
  disp('t')  
else
  disp('f')
end
% elseif any all

if( any(a>1) ), disp('t'); else disp('f'); end

pause % ceka na klavesu
break % ukonci beh

%%% Proc nepouzivat cyklus -------------------------------------------

tic
x = [1:10000000];
toc

tic
for k = 1:10000000
if(x(k)>30)
x(k)=0;
end
end
toc

tic; x(x>30)=0; toc
% viz dalsi priklady na konci souboru


%%% Vizualizace -------------------------------------------------------------
% 1D
t = 0:pi/10:2*pi;
y = sin(t);
plot(y)
plot(t,y)

% Vice grafu do jednoho obrazku:
y2 = sin(t-.25);
y3 = sin(t-.5);

f = figure;
plot(t,y,'r.',t,y2,'',t,y3,'--o')

% dalsi varianta
plot(t,y,'r')
hold on
plot(t,y2,'g')

% Dalsi varianty vypisu na konci dokumentu v bonusech

%%% Definice vlastnich funkci ------------------------------------------
% OBECNE
%   - nazev souboru musi byt shodny s nazvem funkce
%   - funkce muze obsahovat podfunkce (pouze pro vlastni potrebu)

% Vytvorme novy soubor vetsi.m

function x = vetsi(a,b)
% VETSI vrati 1, pokud je prvni z parametru vetsi
%   toto je misto pro popis funkce - napovedu
%   x = vetsi(a,b)
%   a,b - skalary

    if(nargin<2) % kontrola poctu parametru
        error('Zadejte oba parametry')
    end

    if(a>b)
        x = true;
        return
    end
    x = false
end

%%% Dalsi datove typy ------------------------------------------------

% retezec
s = 'ahoj';
disp(s);
                                                                
% vicerozmerne matice
o(:,:,1) = [1 2; 3 4];
o(:,:,2) = [5 6; 7 8]

% struktura
pes.druh  = 'kokrspanel';
pes.jmeno = 'Abraxas';
pes
pes.druh

% matice struktur (jednorozmerna)
pes(2).druh  = 'maxipes';
pes(2).jmeno = 'Fik';

% nehomogenni matice struktur
zvire = {};
zvire{1} = pes(1);
zvire{2} = pes(2);
zvire{3} = 'zirafa'
zvire{2}

% cell array (nehomohenni matice)
p1 = 'radka';
p2 = 'dlouha radka';
p  = [p1; p2];

p  = {p1; p2};
P1 = p{1,1} % !!!
P2 = p(1,1)
whos P1 P2

%%% Bonusy
% ===========================================================================
% BONUS: Vizualizace 3D dat (funkce z = f(x,y))
figure(2);
[X,Y] = meshgrid(-8:.5:8,-5:.2:5);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;
mesh(X,Y,Z)
pause
surf(Z)
pause
plot3(X,Y,Z)


% BONUS: DALSI PRIKLADY NA INDEXACI -----------------------------------------
n = 10000;
% Ukol: Vyroba sachovnice (n rozmer)
% napiste efektivni program, ktery vytvori matici s nulami a jednickami na
% mistech cernych, resp. bilych poli na sachovnici


% Ukol: Cisla sloupcu
% vytvorte ctvercovou matici A velikosti n, jez bude v kazdem sloupci
% obsahovat pouze cislo daneho sloupce napr pro n=3 by bylo A=[1 2 3; 1 2 3; 1 2 3]
% porovnejte rychlost Vaseho reseni s resenim pomoci funkce meshgrid()


% Ukol: vytvorte takovou matici, ve ktere bude x(i,j) = max(i,j)
