% 2. Cviceni X33ROB - ponekud hlubsi uvod do matlabu
%
% pripraveno na motivy Help souboru Matlabu
% Vychazi ze skriptu Vitka Zyky a Hynka Baksteina
%
% The MathWorks Inc. (http://www.mathworks.com/)
% MATrix LABoratory

% Obsah :
%  - Skripty a funkce
%  - Datove typy (struktura, nehomogenni matice)
%  - Vizualizace (2D a 3D grafy)
%  - Ukladani dat, ...
%  - Reseni linearnich rovnic

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

%%% Skripty a funkce ---------------------------------------------------------
%%%%% M-soubory: 
% * SKRIPTY nemaji vstupni ani vystupni parametry, pracuji s
%     (globalnimi) promennymi prostredi;
%     zapis kodu do souboru script.m; spusteni: pokus
% * FUNKCE komunikuji pres vstupni a vystupni parametry, jejich 
%     promenne jsou lokalni.
% nazev souboru

% funkce
h = hilbert(5)

clear functions

path
addpath('C:\users')
rmpath('C:\users')

which

% nargin, nargout

%%% 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')

% 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)
surf(Z)
plot3(X,Y,Z)

% Kresleni do existujiciho grafu:
[x,y,z] = peaks;
contour(x,y,z,20,'k')
hold on
pcolor(x,y,z)
%shading interp
hold off;

colormap(gray)
colormap(hot)

% Vlastosti obrazku
% - osy
axis off, axis on
axis equal
axis([xmin xmax ymin ymax])
axis square
axis auto % implicitni chovani

% Popisovani grafu 
% - vycerpavajicim zpusobem popsany graf
figure(1), clf
t = 0:pi/10:2*pi; y = sin(t);
y2 = sin(t-.25); y3 = sin(t-.5);
plot(t,y,'r.',t,y2,'',t,y3,'--o');

% Uprava os
grid on
box off

% Popisky
axis([0 2*pi -1 1])
title('Tri krivky')
xlabel('0 \leq {\itt} \leq 2\pi')
ylabel('sin(t-x_0)')
ht = text(2,-1/3,'\it{inflexni bod}');
line([2.5,pi],[-0.3,0]);
legend('jedna','dva','tri');

% Prace s identifikatorem objektu
get(ht)
set(ht, 'FontSize', 12)
set(ht, 'FontSize', 16, 'FontWeight','bold')
get(gcf)
get(gca)
set(gca, 'xtick', 0:.5:6.5)		%
helpdesk

% Tisk, export obrazku
print -depsc graf  % Postscript (vektorove)
print -dtiff graf  % bitmapa


%%% 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

%%% Uzitecnosti ------------------------------------------------------

% Zapis vice radku
s = 1 -1/2 + 1/3 -1/4 + 1/5 - 1/6 + 1/7 ...
      - 1/8 + 1/9 - 1/10 + 1/11 - 1/12;

% Ukladani a nacitani promennych
save matfile y y2 y3
save matfile                 % ulozi vse
save asciifile.txt y -ASCII  % bez nazvu promennych

load matfile
w = load('matfile.mat')
w = load('asciifile.txt','-ASCII')

%%% Linearni algebra -----------------------------------------------

% 'magicka matice': soucty radku, sloupcu a diagonal maji byt stejne
A = magic(4)

det(A)           % nula: matice je singularni, nema inverzni matici
inv(A)           % pozor na zaokrouhlovaci chyby!
rank(A)
eig(A)           % vlastni cisla matice A
[V,D] = eig(A)   % Sloupce V jsou vlastni vektory, D ma vlastni cisla
                 % na diagonale, takze A*V = V*D.
[U,S,V] = svd(A) % Singularni rozklad matice A: S je diagonalni,
                 % matice U a V jsou ortonormalni, A = U*S*V'.
                 
                 
%%% Primka - parametricka rovnice -----------------------------------

y1 = 2
y2 = 6;
x1 = 3; x2 = 8;
a = [x1, y1]
b = [x2, y2];

figure(1);
plot([a(1); b(1)],[a(2); b(2)],'b+');
axis([0 10 0 10]);

yi = [a(2); b(2)]
xi = [a(1); b(1)]
x = [xi ones(size(xi,1),1)]
q = inv(x) * yi
q = x \ yi

figure(1);
xo = [-1:10]';
xo = [xo ones(size(xo,1),1)];
yo = xo*q
hold on
plot(xo(:,1),yo,'g-')
hold off
grid on


%%% Primka - homogenni rovnice -----------------------------------

x = [xi yi ones(size(xi,1),1)]
[u, s, v] = svd(x)
a = v(:,end)


%%% Pokus s hilbertovou matici -----------------------------------

n = 20;

h = hilbert(n);
ai = ones(n,1);
b = h*ai;

x = [h, -b];
[u s v] = svd(x);
a = v(:,end);
a = a./a(end);
ao = a(1:end-1);

sum(abs(ao-ai))
sum(abs(h*ao - b)) 
 

