% ******************* MATEMATICKÝ SEMINÁŘ č. 3 ************************
% 3.1 SUBMATICE A INDEXOVÁNÍ
% 3.2 SUBMATICE NA LEVÉ STRANĚ PŘIŘAZOVACÍHO PŘÍKAZU
%
% 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
%======================================================================
% 3.1 SUBMATICE A INDEXOVÁNÍ
%----------------------------------------------------------------------
%% v(r)   ... subvektor vektoru v určený včetně pořadí vektorem indexů r
%% A(r,s) ... submatice v A
%%            r=vektor řádkových indexů, s=vektor sloupcových indexů
%%            za r nebo s lze dosadit také indikátorový vektor z 0 a 1
%% A(r,:) ... řádky r a všechny sloupce
%% A(:,s) ... všechny řádky a sloupce s
%% A(:,:)=A
  A=(1:10)'*(1:8), %  tedy máme A(r,s)=r*s
% vyzkoušíme vytvořit novou matici pomocí indexů:
  S=A([1,3,5,7],[3,7,8])
pause;
% nebo také
  S=A(1:2:7,[3,7,8])
pause;
% nebo také
  S=A(logical([1 0 1 0 1 0 1 0 0 0]),logical([0 0 1 0 0 0 1 1]))     
% speciálně r nebo s může být skalár:
  A(3,7),          %  jeden prvek matice A ve 3. řádku a 7. sloupci
  r4=A(4,:)        %  4. řádek   A
  s6=A(:,6)        %  6. sloupec A
  Aperm=A(10:-1:1,:) % Řádkově permutovaná matice (řádky v obráceném pořadí)
keyboard;

%% A(:)   ... sloupce matice A naskládané pořadě pod sebe do sl. vektoru
%%            (matematická operace obvykle značená jako vec A)
%%            odpovídá uložení prvku matice v paměti
%% A(r)   ... totéž jako: v=A(:); v(r)
%%            A řád./sl. vektor => výběr řád./sl. subvektoru na pozicích r
%% A=reshape(v,m,n)
%%   reshape(v,[m,n]) ... opak k A(:) - z řád. nebo sl. vektoru v délky m*n
%%                        vytvoří matici A typu m x n, pro níž v=A(:)
  u=1:30 % vytvoříme vektor u
  v=reshape(u,length(u),1)  % transponuje řádkový vektor u na sloupcový
pause;
  u(1:2:length(u))          % subvektor s lichými indexy
  u(2:2:length(u))          % subvektor se sudými indexy
pause;
% vektor v přeuspořádáme do matice   
  A1=reshape(v,2,15) 
% a zpět
  A1(:)
pause;
  A2=reshape(v,[3,10])
  A2=reshape(v,size(A2))
  A2(4)
pause;
  A=reshape(u,5,6)
  A([4,8])
keyboard;

%======================================================================
% 3.2 SUBMATICE NA LEVÉ STRANĚ PŘIŘAZOVACÍHO PŘÍKAZU
%----------------------------------------------------------------------
%% v(r)=b   ... přepis vektoru v vektorem b na pozicích indexu r 
%% A(r,s)=B ... Submatice A na pozicích určených vektory indexu r a s
%%              se přepíše prvky matice B (B je typu length(r) x length(s))
%%              Jestliže některé pozice prvků jdou mimo stávající rozměr
%%              matice A, pak A se automaticky zvětší na potřebnou
%%              velikost a doplní nulami.
%% Analogicky
%% A(r,:)=B ... přepis na řádcích r a ve všech sloupcích
%%              B=[] => odstraní řádky r
%% A(:,s)=B ... přepis ve všech řádcích a ve sloupcích s
%%              B=[] => odstraní sloupce s
%% A(r)=b   ... přepis prvku na libovolných pozicích v uspořádání A(:)
%%              A(r)=b, b neprázdná <=> v=A(:); v(r)=b; A=reshape(v,size(A));
%%              A(r)=[]             <=> v=A(:); v(r)=[]; A=v

  u=1:30
  A=reshape(u,5,6)
  A(5,:)=[]    % Smažeme 5. řádek
  A(:,6)=[]    % a 6. sloupec
pause;
  A([1,3],[2,3])=zeros(2)
% nebo také jednodušeji lze uvést na pravé straně jen skalár 0:
  A([1,3],[2,3])=0
pause;
  A(5,6)=-1
pause;
  A(logical([1 0 1 0 0]),logical([0 1 1 0 0 0]))=-ones(2)       
% speciálně r nebo s může být skalár:
  A(3,5)=1000,             %  přepis prvku matice A ve 3. řádku a 5. sloupci
pause;
  A(4,:)=100*ones(1,size(A,2)) %  přepis 4. řádku A
pause;
  A(:,6)=100                   %  přepis 6. sloupce A jednodušeji skalárem
pause;

%----------------------------------------------------------------------
% Příklad na přepis prvků na libovolných pozicích
% Chceme obrátit znaménka prvků A(2,1) a A(1,2):
  A=reshape(1:6,2,3)
  P(2,1)=1, P(1,2)=1, P(1,3)=0
% Předchozí 3 příkazy třikrát realokují matici na větší rozměr,
% proto lepší postup je:
  P=zeros(size(A)); P(2,1)=1, P(1,2)=1, P=logical(P)                  
  A(P(:))=-A(P(:))      % Obrácení znaménka prvků A(2,1) a A(1,2)
keyboard;

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