Jednoduchý úvod do MATABu II

Pokračovanie z minulého cvičenia.

Contents

Vyčistíme si priestor premenných

clear

Riedke matice

Pre matice, ktoré majú málo nenulových prvkov je vhodnejšia reprezentácia pomocou tzv. riedkych matíc. V pamäti sú potom uložené iba indexy a hodnoty nenulových prvkov. V nasledujúcom príklade je A hustá matica a B je jej riedka verzia:

A=[ 0 2 0; 1 0 0; 0 0 5]
A =
     0     2     0
     1     0     0
     0     0     5
B=sparse(A)
B =
   (2,1)        1
   (1,2)        2
   (3,3)        5
whos
  Name      Size            Bytes  Class     Attributes

  A         3x3                72  double              
  B         3x3                52  double    sparse    

S riedkymi maticami je možné počítať úplne rovnako ako s hustými maticami a vo výrazoch sa obidve reprezentácie matíc môžu ľubovoľne miešať:

C=3*B
C =
   (2,1)        3
   (1,2)        6
   (3,3)       15
D=A+B
D =
     0     4     0
     2     0     0
     0     0    10

Tiež je možné "vynútiť" si zmenu reprezentácie matice na hustú ("plnú"):

E=full(B)
E =
     0     2     0
     1     0     0
     0     0     5

Funkcií generujúcich riedke matice je viacej (napr. speye(n), viz. nápoveda), ale nebudeme ich potrebovať.

Štruktúry

štruktúry zodpovedajú C-kovej struct, ale bez deklarovania zložiek. Položky záznamu sa označujú bodkovou notáciou.

a.x=8
a = 
    x: 8
a.y=9
a = 
    x: 8
    y: 9
sqrt(a.x^2+a.y^2)
ans =
   12.0416
whos
  Name      Size            Bytes  Class     Attributes

  A         3x3                72  double              
  B         3x3                52  double    sparse    
  C         3x3                52  double    sparse    
  D         3x3                72  double              
  E         3x3                72  double              
  a         1x1               264  struct              
  ans       1x1                 8  double              

fieldnames(a)
ans = 
    'x'
    'y'

Bunkové polia (cell arrays)

Matica ($n$-rozmerné pole) v MATLABe je homogénne v zmysle, že všetky prvky poľa majú rovnaký typ. To znemožňuje vložiť do poľa prvky rôznych typov. Presne toto však umožňujú bunkové polia. Na rozdiel od štandardných polí sa zapisujú do zložených zátvoriek a aj ich indexy sa píšu do zložených zátvoriek:

A = {1 [3;2] [1 2; 3 4]}
A = 
    [1]    [2x1 double]    [2x2 double]
A{2}
ans =
     3
     2
whos
  Name      Size            Bytes  Class     Attributes

  A         1x3               236  cell                
  B         3x3                52  double    sparse    
  C         3x3                52  double    sparse    
  D         3x3                72  double              
  E         3x3                72  double              
  a         1x1               264  struct              
  ans       2x1                16  double              

MATLAB umožňuje (na rozdiel od Octave) definovať triedy a programovať pomocou prostriedkov objektovo orientovaného programovania (viz help class). Ale zatiaľ nebudeme potrebovať

Programovanie v MATLABe

MATLAB je jazyk orientovaný na výrazy. Zadávané výrazy sú interpretom rovno vyhodnocované ako príkazy. Príkaz má teda tvar

premenná = výraz

alebo priamo

výraz

Na jednom riadku môže byť viacej príkazov oddelených čiarkami alebo stredníkmi. Výraz zakončený stredníkom je vyhodnotený, ale jeho hodnota sa nevypíše. To sa používa v programoch na to, aby neboli vypisované všetky medzivýsledky výpočtov.

b=eye(3); c = 2*b; d = c^4+b
d =
    17     0     0
     0    17     0
     0     0    17

Programové konštrukcie ako napr. cyckly je možné používať i v interaktívnom režime, ale obvyklejšie je použitie v skriptoch (programoch). Je možné používať cykly for.

for I = 1:10
    fprintf('%d^2 = %d\n',I,I*I)
end
1^2 = 1
2^2 = 4
3^2 = 9
4^2 = 16
5^2 = 25
6^2 = 36
7^2 = 49
8^2 = 64
9^2 = 81
10^2 = 100
I=1;
while I<=10
    x=[I,I*I]
    I=I+1;
end
x =
     1     1
x =
     2     4
x =
     3     9
x =
     4    16
x =
     5    25
x =
     6    36
x =
     7    49
x =
     8    64
x =
     9    81
x =
    10   100

Podmienený príkaz má obecný tvar

if podmienka

   príkazy

elseif podmienka

  príkazy

...

else

  príkazy

end

I = 6;
if I<2
    disp('Je to málo')
elseif I<10
    disp('Je to akurát')
else
    disp('To je už príliš mnoho')
end
Je to akurát

Relačné operátory MATLABu sú

< menší

Podmienky sa môžu spojovať pomocou logických spojok

x = randn(1)
x =
   -0.1924
if -1<x & x<1
    disp('Skoro nula')
end
Skoro nula

Pozor na porovnávanie matíc! Ak chceme vykonať príkaz v prípade, že sa matice A a B rovnajú:

A = rand(2);
B = A;
if A==B
    disp('Sú rovnaké')
end
Sú rovnaké

Ale stačí malý rozdiel a ...

A(1,1)=2
B(1,1)=sqrt(2)^2;
if A==B
    disp('Sú rovnaké')
else
    disp('Sú rôzne')
end
A =
    2.0000    0.1966
    0.3500    0.2511
Sú rôzne

Správne porovnanie matíc reálnych čísel:

tol=0.00001
if abs(A-B)<abs(A)*tol
    disp('Sú rovnaké')
else
    disp('Sú rôzne')
end
tol =
  1.0000e-005
Sú rovnaké

Pozor na test nerovnosti matíc

if A~=B
    disp('Sú rôzne')
else
    disp('Sú rovnaké')
end
Sú rovnaké

Test A~=B vráti maticu núl a jedničiek.

T = A~=B
if T
    disp('Sú rôzne')
else
    disp('Sú rovnaké')
end
T =
     1     0
     0     0
Sú rovnaké

Podmienka if T otestuje nenulovosť matice T! Správne sa buď využije funkcia any, ktorá pre vektor vráti 1, ak aspoň jedna z jeho zložiek je nenulová, a pre maticu vráti riadkový vektor výsledkov zodpovedajúcich aplikácii any na každý stĺpec.

if any(any(A~=B))
    disp('Sú rôzne')
end
Sú rôzne

Alebo jednoduchšie

if A==B else
    disp('Sú rôzne')
end
Sú rôzne

Na redukciu matíc na vektory a skaláry sa dá tiež využiť funkcia all - viz nápoveda.

Programy v MATLABe

Programy v MATLABe sa nazývajú m-súbory (majú príponu .m) a používajú sa

buď ako

  1. buď ako skripty
  2. alebo ako funkcie.

Skript

obsahuje postupnosť príkazov, ktoré majú byť vykonané. Ak má meno XX.m, tak sa zavolá príkazom XX. Všetky premenné, ktoré sa v ňom vyskytujú sú globálne. Dá sa použiť napr. na inicializáciu premenných alebo na zápis nejakého výpočtu.

Funkčný m-súbor

obsahuje deklaráciu práve jednej funkcie. Meno deklarovanej funkcie musí súhlasiť s menom súboru. Prvý riadok súboru musí obsahovať hlavičku tejto funkcie v tvare

function vysledok = XX(par1,par2,...,parN)

vysledok je premenná, do ktorej bude uložená návratová hodnota. par1, ..., parN sú parametre funkcie. Ich typ sa neuvádza.

Príklad je v súbore GenMat.m