% 1. 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 :
%  - 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
%  -> +++ vyvoj, vyzkum; - aplikace

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

%%% Zpusob prace ------------------------------------------------------
% M file - textovy soubor s prikazy (skript)
% z neho kopiruji na prikazovou radku Matlabu

diary test.m

diary off

diary on
diary off

edit

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

help sum

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]
f = [1;2;3]

% Matice (pro prehlednost dobre 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]

%%% Indformace o promennych --------------------------------------------

size(k)
size(k,2)
length(k)
whos

exist('k')

clear('K')

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

Z1 = zeros(2,5)
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 ---------------------------------------------
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);
r2 = randn(100,100);

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

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

sum(A)
sum(A')

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:1000000];
toc

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

tic; x(x>30)=0; toc

% Priklad indexujiciho pole (ozn sloupcu)
n = 10;
x = ones(n,1)*[1:n]

n = 1000;

tic
x = ones(n,1)*[1:n];
toc

tic
for k = 1:n,
  for l = 1:n,
    x(l,k) = k;
  end;
end;
toc

% Ukol x(i,j) = max(i,j)
tic
for k = 1:n,
  for l = 1:n,
    x(l,k) = max(k,l);
  end;
end;
toc

tic
x = max(ones(n,1)*[1:n],[1:n]'*ones(1,n));
toc

% Vyroba sachovnice (n rozmer)
tic
x = zeros(n,n);
x(1:2:end,2:2:end) = 1;
x(2:2:end,1:2:end) = 1;
toc

tic;
x = mod(ones(n,1)*[1:n] + [1:n]'*ones(1,n),2);
toc