% ******************* MATEMATICKÝ SEMINÁŘ č. 4 ************************
% 4.1. ZÁKLADNÍ MATICOVÉ OPERÁTORY A FUNKCE
% 4.2. OPERACE PO SLOŽKÁCH
% 4.3. PRAVÉ A LEVÉ MATICOVÉ DĚLENÍ
% 4.4. MATICOVÉ UMOCŇOVÁNÍ
%
% Copyright (C) 1996-2003 by V. Veselý (Masaryk University Brno, Czech Republic)
%
% Dávka je kompletně upravena pro menu-systém.
 
echo on
more on
format compact
clc
%======================================================================
% 4.1. ZÁKLADNÍ MATICOVÉ OPERÁTORY A FUNKCE
%----------------------------------------------------------------------
%% sčítání (+), odečítání (-)
%% X=A+B <=> X(r,s)=A(r,s)+B(r,s)
%% X=a+B <=> X(r,s)=a+B(r,s), a skalár
%% X=A+b <=> X(r,s)=A(r,s)+b, b skalár
%%
%% Podobně pro odčítání
%% sum(v) = v(1)+v(2)+...+v(n), kde v je vektor
%% sum(A) = [sum(A(:,1)),...,sum(A(:,n))] ... řádkový vektor sloupcových
%%                                            součtů
  a=1000; b=100; A=[-2 0 2;-1 1 3], B=[-1 0 1;0 1 2], u=5:-1:1; v=1:5;
  A+B
  A-B
pause;
%----------------------------------------------------------------------
  a+B
  A+b
pause;
%----------------------------------------------------------------------
 sum(v)
 sum(A)
pause;

%% transpozice (.') a hermitovský operátor (')
%% X=A.' <=> X(r,s)=A(s,r)
%% X=A.' <=> X(r,s)=conj(A(s,r)), kde conj() značí komplexně sdružené číslo
  A=[-2 0 2;-1 1 3], B=[-1 0 1;0 1 2]
  Bt=B.'
  C=A+i*B
  C'
  C.'
pause;

%% maticové násobení (*), Kroneckerův (tensorový) součin (kron)
%% skalární součin (dot), vektorový součin (cross)
%%
%% X=A*B <=> X(r,s)=suma{k}A(r,k)*B(k,s)
%% X=a*B <=> X(r,s)=a*B(r,s), a skalár
%% X=A*b <=> X(r,s)=A(r,s)*b, b skalár
%% X=kron(A,B) <=> X=[A(r,s)*B]
%%
%% dot(u,v) = suma{k}conj(u(k))*v(k), kde u, v jsou vektory
%% dot(A,B) = [dot(A(:,1),B(:,1)),...,dot(A(:,n),B(:,n))]
%% cross(u,v)=w=[u(2)*v(3)-u(3)*v(2),u(3)*v(1)-u(1)*v(3),u(1)*v(2)-u(2)*v(1)],
%%              kde u, v jsou 3-prvkové vektory (w je kolmý na u i v)
%% cross(A,B) = [cross(A(:,1),B(:,1)),...,cross(A(:,n),B(:,n))]
%% prod(v)  = v(1)*v(2)*...*v(n), kde v je vektor
%% prod(A)  = [prod(A(:,1)),...,prod(A(:,n)) ... řádkový vektor sloupcových
%%                                               součinů
  a=1000; b=100; A=[-2 0 2;-1 1 3], B=[-1 0 1;0 1 2], u=5:-1:1; v=1:5;
  Bt=B.'
  M=A*Bt
  a*B
  A*b
  kron(A,B)
keyboard;

  dot(u,v)
% je totéž jako:
  u*v.', v*u.'
  dot(A,B)
pause;
%----------------------------------------------------------------------
  uu=u(1:3), vv=v(1:3), uv=[uu;vv]
  w=cross(uu,vv)
% je totéž jako:
  [det(uv(:,[2,3])),-det(uv(:,[1,3])),det(uv(:,[1,2]))]
% kontrola kolmosti:
  dot(w,uu), dot(w,vv)
  cross(A.',B.')
pause;

  prod(v)    % =5! ... obecně prod(1:n)=n! (n faktoriál), přičemž
  prod(1:0)  %         prod(1:0)=prod([])=1
  prod(A)
keyboard;

%% Hodnost, inverze a determinant matice
%% rank(A) ... hodnost matice A
%% inv(A)  ... inverze čtvercové matice A
%% det(A)  ... determinant matice A
%% trace(A)... stopa matice (součet prvků v hlavní diagonále)
  a=1000; b=100; A=[-2 0 2;-1 1 3], B=[-1 0 1;0 1 2], u=5:-1:1; v=1:5;
  Bt=B.';
  M=A*Bt;
  M
  rank(M)
  inv(M)
  inv(M)*M
  det(M)
  trace(M)
keyboard;

%======================================================================
% 4.2. OPERACE PO SLOŽKÁCH
%----------------------------------------------------------------------
%% násobení (.*), pravé dělení (./), levé dělení(.\), umocňování (.^)
%% X=A.*B <=> X(r,s)=A(r,s)*B(r,s)
%% X=a.*B <=> X(r,s)=a*B(r,s), a skalár
%% X=A.*b <=> X(r,s)=A(r,s)*b, b skalár
%% X=A./B=B.\A <=> X(r,s)=A(r,s):B(r,s)
%% X=a./B=B.\a <=> X(r,s)=a:B(r,s), a skalár
%% X=A./b=b.\A <=> X(r,s)=A(r,s):b, b skalár
%% X=A.^B <=> X(r,s)=A(r,s)^B(r,s)
%% X=a.^B <=> X(r,s)=a^B(r,s), a skalár
%% X=A.^b <=> X(r,s)=A(r,s)^b, b skalár
  a=1000; b=100; A=[-2 0 2;-1 1 3], B=[-1 0 1;0 1 2];
  Bt=B.'
  M=A*Bt
  A.*B
  a.*B
  A.*b
pause;
%----------------------------------------------------------------------
  D=A./B, B.\A
pause;
%----------------------------------------------------------------------
  a./B, B.\a
pause;
%----------------------------------------------------------------------
  A./b, b.\A
pause;
%----------------------------------------------------------------------
  A.^B
  2.^B
  A.^2
keyboard;

%======================================================================
% 4.3. PRAVÉ (/) A LEVÉ (\) MATICOVÉ DĚLENÍ
%----------------------------------------------------------------------
%% X=A\B <=> X je řešení maticové rovnice  A*X=B
%%           POZOR! 2. \A=2\A není totéž jako 2.\A=2 .\A
%% X=B/A <=> X je řešení maticové rovnice  X*A=B
%%           POZOR! 2. /A=2/A není totéž jako 2./A=2 ./A
%% B/A=(A.'\B.').' , neboť X*A=B <=> A.'*X.'=B.'
%%
%% ALGORITMUS PRO \:
%% (1) A čtvercová => X=inv(A)*B (Gaussova eliminace)
%%     A (skoro) singulární=> chybové varování (řešení bez záruky)
%% (2) A nečtvercová => X je (nějaké) řešení ve smyslu metody nejmenších
%%                      čtverců (MNČ), tj. minimalizující euklidovskou
%%                      normu ||A*X(:,s)-B(:,s)|| pro každé s.
%%     řešení vždy existuje.
a=1000; b=100; A=[-2 0 2;-1 1 3], B=[-1 0 1;0 1 2], u=5:-1:1; v=1:5;
  Bt=B.';
  M=A*Bt;
  X=A\B
  A*X-B
pause;
%----------------------------------------------------------------------
  v=v.'
  60./v,  60 ./v
% je různé od
  60. /v, 60/v
pause;
%----------------------------------------------------------------------
% A nečtvercová
  X=B/A  %
  X*A-B
  (A.'\B.').'
pause;
%----------------------------------------------------------------------
% doplníme A na singulární čtvercovou
  A=[A;sum(A)]
  B=[B.',A(:,1)+A(:,2)]
  A\B
pause;
%----------------------------------------------------------------------
% algoritmus (1) selhal, doplníme proto řádek nul na ekvivalentní
% systém s nečtvercovou maticí soustavy, abychom mohli použít
% MNČ algoritmus (2):
  A=[A;zeros(1,3)]
  B=[B;zeros(1,3)]
  X=A\B
  A*X-B
keyboard;   %  Vyzkoušejte pravé dělení

%======================================================================
% 4.4. MATICOVÉ UMOCŇOVÁNÍ (^)
%----------------------------------------------------------------------
%% (1) X = A^p, A čtvercová n x n, p skalár
%%
%% a) p>0 celé => A^p=A*A*...*A  (p-tá maticová mocnina)
%%
%% b) p=0 => A^p=eye(n)  (jednotková matice)
%%
%% c) p<0 celé => A^p=inv(A)*inv(A)*...*inv(A)
%%                 (p-tá inverzní maticová mocnina)
%%
%% d) p necelé => A^p=V*D.^p/V, kde [V,D]=eig(A) a
%%                D=diag(d(1),...,d(n)) jsou vlastní čísla A
%%                V(:,s) je vlastní vektor příslušný k d(s)
%%                Tedy A*V=V*D a (A^p*V=V*D.^p <=> A^p=V*D.^p/V), kde
%%                D.^p=diag(d(1)^p,...,d(n)^p)
  a=1000; b=100; A=[-2 0 2;-1 1 3], B=[-1 0 1;0 1 2], u=5:-1:1; v=1:5;
  Bt=B.';
  M=A*Bt;
  A=M
  A^2
  A^2-A*A
pause;
  A^0
  A^(-2)
  A^(-2)-inv(A)*inv(A)
keyboard;
clc;
  [V,D]=eig(A)
  A*V-V*D
pause;
  p=2.5;
  A^p
  A^p-V*D.^p/V
keyboard;

%% (2) X = p^A, A čtvercová n x n, p skalár
%% p^A=V*p^D/V, kde [V,D]=eig(A) a
%%              D=diag(d(1),...,d(n)) jsou vlastní čísla A
%%              V(:,s) je vlastní vektor příslušný k d(s)
%%              Tedy A*V=V*D a (p^A*V=V*p^D <=> p^A=V*p^D/V), kde
%%              p^D=diag(p^d(1),...,p^d(n))
%% POZOR! např.  2^A=2. ^A není totéž jako 2.^A=2 .^A
%%
%% Komplexní čísla se ve výše uvedených operacích umocňují v komplexním
%% oboru:
%% a^b=exp^(b*log(a)), kde při a=r*exp(i*phi) je log(a)=log(r)+i*phi
%% log = přirozený logaritmus v MATLABu
  a=1000; b=100; A=[-2 0 2;-1 1 3], B=[-1 0 1;0 1 2], u=5:-1:1; v=1:5;
  Bt=B.';
  M=A*Bt;
  A=M
  2^A , 2. ^A
% je různé od
  2.^A, 2 .^A
pause;
%----------------------------------------------------------------------
  [V,D]=eig(A)
  2^A-V*2^D/V
  2^D, 2.^D     % Není totéž
keyboard;
  a=1+i; b=2-i;
  a^b
  exp(b*log(a))
keyboard;

%================================= KONEC ==============================
%
%
%%
more off
echo off
