% ******************* MATEMATICKÝ SEMINÁŘ č. 5 ************************
% 5.1. RELAČNÍ OPERÁTORY
% 5.2. LOGICKÉ OPERÁTORY
% 5.3. SMÍŠENÉ ARITMETICKO-LOGICKÉ VÝRAZY
% 5.4. LOGICKÉ FUNKCE
%
% 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
%======================================================================
% 5.1. RELAČNÍ OPERÁTORY
%----------------------------------------------------------------------
%% rovno (==), nerovno (~=)
%% menší (<) , menší nebo rovno (<=)
%% větší (>) , větší nebo rovno (>=)
%%
%% X=(A==B) <=> X(r,s)=1, jestliže A(r,s) rovno   B(r,s)
%%              X(r,s)=0, jestliže A(r,s) nerovno B(r,s)
%% X=(a==B) <=> X(r,s)=1, jestliže a rovno   B(r,s)
%%              X(r,s)=0, jestliže a nerovno B(r,s)
%% X=(A==b) <=> X(r,s)=1, jestliže A(r,s) rovno   b
%%              X(r,s)=0, jestliže A(r,s) nerovno b
%%
%% Podobně pro nerovnosti
%% X=(A<B) <=> X(r,s)=1, jestliže real(A(r,s)) <  real(B(r,s))
%%             X(r,s)=0, jestliže real(A(r,s)) >= real(B(r,s))
%% X=(a<B) <=> X(r,s)=1, jestliže real(a) <  real(B(r,s))
%%             X(r,s)=0, jestliže real(a) >= real(B(r,s))
%% X=(A<b) <=> X(r,s)=1, jestliže real(A(r,s)) <  real(b)
%%             X(r,s)=0, jestliže real(A(r,s)) >= real(b)
%% kde real() značí v MATLABu reálnou část
%% Podobně pro operátory <=, > a >=
  A=[-2 0 2;-1 1 3], B=[-1 0 1;0 1 2]
  A==B
  A+i*B~=B-i*A
  A==1, 1==A
pause;
%----------------------------------------------------------------------
  A<B
  A+i*B<B-i*A
%----------------------------------------------------------------------
keyboard;  % Vyzkoušejte ostatní relace

%======================================================================
% 5.2. LOGICKÉ OPERÁTORY
%----------------------------------------------------------------------
%% logická spojka "a" (&),
%% logická spojka "nebo" (|), logická spojka "buď a nebo" (xor)  
%% negace (~)
%%
%% X=(A&B) <=> X(r,s)=1, jestliže A(r,s)~=0 a    B(r,s)~=0
%%             X(r,s)=0, jestliže A(r,s)==0 nebo B(r,s)==0
%% X=(a&B) <=> X(r,s)=1, jestliže a~=0 a    B(r,s)~=0
%%             X(r,s)=0, jestliže a==0 nebo B(r,s)==0
%% X=(A&b) <=> X(r,s)=1, jestliže A(r,s)~=0 a    b~=0
%%             X(r,s)=0, jestliže A(r,s)==0 nebo b==0
%%
%% Podobně pro | a xor                  
%% X=~A <=> X(r,s)=1, jestliže A(r,s)==0
%%          X(r,s)=0, jestliže A(r,s)~=0
%%
%% Místo  A&B  lze psát   and(A,B),                               
%% místo  A|B  lze psát   or(A,B),                                
%% místo   ~A  lze psát   not(A),                                 
%% logickou spojku xor lze však použít pouze ve tvaru xor(A,B).    
  a=[0 0 1 1]
  b=[0 1 0 1]
  a&b
  a|b
  xor(a,b)
  ~a
keyboard;

%======================================================================
% 5.3. SMÍŠENÉ ARITMETICKO-LOGICKÉ VÝRAZY
%----------------------------------------------------------------------
%% Logické matice (s prvky jen 0 a 1) získané jako výsledek relačních a
%% logických operací mohou vystupovat v aritmetických výpočtech.
%% Platí přitom následující přirozená priorita operátorů
%%
%% 1. umocňování: ^ .^                          (nejvyšší priorita)
%% 2. násobení, dělení: *  .*  \  .\  /  ./
%% 3. sčítání, odčítání: + -
%% 4. relační operátory: == ~= < <= > >=
%% 5. negace: ~
%% 6. logické spojky "a" a "nebo":  &  |        (nejnižší priorita)
%%
%% Jinou prioritu vymezujeme vhodným uzávorkováním pomocí (  a  ).
%% Všimněte si, ze jsme nikam nezařadili logickou spojku xor. To proto,      
%% ze tato spojka se volá jako funkce, což jí zaručuje absolutně nejvyšší    
%% prioritu.                                                             
%%
%% Smíšené výrazy umožňují elegantně nahradit např. rozhodovací 
%% bloky typu if-then-else.
% Příklad: v matici A chceme nahradit
%            záporné prvky číslem -10,
%            nuly číslem 100
%            kladná čísla číslem 1
%          a výsledek uložit do matice X
% Pomocí smíšeného výrazu se jednoduše provede takto:
  A=[-2 0 2;-1 1 3]
  X=-10*(A<0)+100*(A==0)+(A>0)
keyboard;    % Vyzkoušejte podobné úlohy

%======================================================================
% 5.4. LOGICKÉ FUNKCE
%----------------------------------------------------------------------
%% all(v) = v(1) & v(2) & ... & v(n), kde v je vektor
%% all(A) = [all(A(:,1)),...,all(A(:,n))]
%% any(v) = v(1) | v(2) | ... | v(n), kde v je vektor
%% any(A) = [any(A(:,1)),...,any(A(:,n))]
  A=[-2 0 2;-1 1 3]
  all(A)
  all(all(A))
  any(A)
  any(any(A))
keyboard;

%% X=isinf(A)  <=> X = (A==Inf | A==-Inf)
%% X=isnan(A)  <=> X = (A==NaN)
%% X=finite(A) <=> X = (A~=Inf & A~=-Inf & A~=NaN)
  v=[pi NaN Inf -Inf]
  isinf(v)
  isnan(v)
  finite(v)
keyboard;

%% isempty(A) = 1  když A je prázdná matice
%%            = 0  jinak
%% isreal(A) = all(all(real(A)==A))
%%           = 1  když A je reálná
%%           = 0  jinak
%% issparse(A) = 1 když A je řídká matice
%%             = 0 jinak
%% isieee = 1  na počítači s aritmetikou dle normy IEEE
%%        = 0  jinak
%% isnumeric(A) = 1 když A je číselná                      
%%              = 0 jinak                                  
%% islogical(A) = 1 když A je logická                      
%%              = 0 jinak                                  
  A=[-2 0 2;-1 1 3]
  isempty(A)
  isempty([])
  isreal(A)
  A(1,2)=1+i
  isreal(A)
  issparse(A)
  islogical(A)                                
  islogical(A<0)                              
  isieee
keyboard;

%% isstr(A)  = 1 když A je textová matice
%%           = 0 jinak
%% X=isletter(A) <=> X(r,s)=1 jestliže A(r,s) je ASCII kód písmene
%%                   X(r,s)=0 jinak
%% X=isspace(A)  <=> X(r,s)=1 jestliže A(r,s) je ASCII kód bílého znaku  
%%                   X(r,s)=0 jinak                           
%% bílé znaky jsou: mezera, nový řádek (LF), návrat vozu (CR)
%%                  tabulátory (HT a VT), nová stránka (FF).
  A=[-2 0 2;-1 1 3]
  t = [49 '. text']
  isstr(A)
  isstr(t)
  isnumeric(t)                       
  isspace(t)                                                
  isletter(t)

keyboard;

%% Vyhledávání nenulových prvků v matici
%% I = find(v) ... pro  vektor v,
%%     I = [i_1,i_2,...,i_n] ... indexy nenulových prvku ve v.
%% [I,J]  = find(A)
%% nebo
%% [I,J,H]= find(A) ... pro matici
%%          I=[i_1,i_2,...,i_n] ... řádkové indexy nenulových prvku v A.
%%          J=[j_1,j_2,...,j_n] ... sloupcové indexy nenulových prvku v A.
%%          H=[h_1,h_2,...,h_n] ... hodnoty nenulových prvků v A (nepovinný)
%%          Tedy [i_k,j_k] jsou souřadnice k-ho nenulového prvku v A
%%          a h_k je jeho hodnota.
%% I, J a H jsou prázdné matice, pokud v, resp. A je nulová matice
  a=[0 0 1 1]
  I = find(a)
pause;
%----------------------------------------------------------------------
  v=[pi NaN Inf -Inf]
  I = find(v)
pause;
%----------------------------------------------------------------------
  t = [49 '. text']
  I = find(t=='t')
pause;
%----------------------------------------------------------------------
  A=[-2 0 2;-1 1 3]
  [I,J] = find(A)
pause;
  [I,J,H] = find(A)
pause;
  [I,J] = find(A<0)
pause;
%----------------------------------------------------------------------
  [I,J,H] = find(A<0)
  [I,J,H] = find(A>5)
  echo on                                 
keyboard;

%% test existence proměnných a příkazů daného jména
%% h=exist('jmeno')
%%
%%  = 0 ... neexistuje
%%  = 1 ... proměnná
%%  = 2 ... m-soubor v běžném adresáři nebo v MATLABPATH
%%  = 3 ... MEX-soubor v běžném adresáři nebo v MATLABPATH
%%  = 4 ... kompilovaná funkce v systému SIMULINK
%%  = 5 ... interní (předkompilovaná) funkce MATLABu
%%  = 6 ... předkompilovaná m-funkce s názvem jmeno.p. Soubor jmeno.p lze 
%%          vytvořit pomocí příkazu pcode (viz. help pcode).              
%%  = 7 ... adresář       
%%                                                   
%%  Priorita při kolizi jmen (existují různé objekty téhož jména):
%%  1. proměnná
%%  2. interní funkce
%%  3. funkce MEX (napřed běžný adresář, pak MATLABPATH od začátku)
%%  4. příkaz jako p-soubor (napřed běžný adresář, pak MATLABPATH od začátku)
%%  5. příkaz jako m-soubor (napřed běžný adresář, pak MATLABPATH od začátku)
   A=[-2 0 2;-1 1 3]
   exist('A')
   exist('xxxxx')
   exist('rank')
   exist('type')
   pcode rank; exist('rank'), delete rank.p       
   h=cd; exist(h)                                 
keyboard;

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