Jednoduchý úvod do MATABu

Názov je skratka MATrix LABoratory Program navrhnutý na maticové výpočty pred viac než 20 rokmi

Contents

Hlavné použitie programu:

Absolútna väčšina funkcií MATLABu je implementovaná v GNU Octave. Octave je voľne šíriteľné vo verziách pre Unix (Linux) i pre Windows. Nemá grafické IDE. Nemá toolboxy. Kreslenie grafov nie je v Octave integrované. Typicky sa rieši pomocou GNU Plot.

Jednoduché výpočty

Ako vkladať čísla, vektory a matice a základné výpočty s nimi.

Základným dátovým typom sú n-rozmerné polia (primárne dvojrozmerné - matice) reálnych čísel. Zapisujú sa do hranatých zátvoriek. Oddeľovačom sú medzery, tabelátory a čiarky v riadkoch, stredníky a znaky konca riadku oddeľujú riadky. Najprv vektory - riadkový x a stĺpcový y. Ich súčinom je matica.

x=[2,3,4]
x =
     2     3     4
y=[1;2]
y =
     1
     2
z=y*x
z =
     2     3     4
     4     6     8
Vloženie matice
A=[2.3  4.8 9.2; 21.34 1.3e12 9]
A =
  1.0e+012 *
    0.0000    0.0000    0.0000
    0.0000    1.3000    0.0000

Pri výpise matice A je pred maticou vypísaný spoločný koeficient 1.0e+012 *, ktorým majú byť vynásobené všetky prvky matice

B = [ 1 9 23
        21 2 1
        9 11 99]
B =
     1     9    23
    21     2     1
     9    11    99

Skaláry sú matice s rozmermi 1x1

a = 3.1
a =
    3.1000
u = a*z
u =
    6.2000    9.3000   12.4000
   12.4000   18.6000   24.8000

MATLAB rozlišuje veľké a malé písmená. Premenné sa nedeklarujú. Zoznam definovaných premenných sa zistí príkazom who

who
Your variables are:

A          CoJeTo     ans        nekonecno  tab        y          
B          D          b          nula       u          z          
C          a          idx        t          x          

Podrobnejšie informácie o premenných dá príkaz whos alebo okno Workspace

whos
  Name           Size            Bytes  Class     Attributes

  A              2x3                48  double              
  B              3x3                72  double              
  C              3x2                48  double              
  CoJeTo         1x1                 8  double              
  D              3x2                48  double              
  a              1x1                 8  double              
  ans            1x3                24  double              
  b              3x1                24  double              
  idx            1x3                24  double              
  nekonecno      1x1                 8  double              
  nula           1x1                 8  double              
  t              1x32              256  double              
  tab            1x32              256  double              
  u              2x3                48  double              
  x              1x3                24  double              
  y              2x1                16  double              
  z              2x3                48  double              

Aritmetika MATLABu je "robustná"

nekonecno = a/0
nekonecno =
   Inf
nula = 1 / nekonecno
nula =
     0
CoJeTo = nekonecno / nekonecno
CoJeTo =
   NaN

Vydrží aj odmocňovanie záporných čísel

sqrt(-1)
ans =
        0 + 1.0000i

MATLAB vie počítať s komplexnými číslami. Imaginárna jednotka sa značí buď i alebo j

(1+2i)*(1-2j)
ans =
     5

MATLAB je vlastne veľmi výkonná kalkulačka. Výsledok posledného výrazu (neuloženého do premennej) je v premennej ans

2^3
ans =
     8
2^4
ans =
    16
2^100
ans =
  1.2677e+030
20^3-3*23/8
ans =
  7.9914e+003
sqrt(ans)
ans =
   89.3945

Ovláda mnoho aritmetických, goniometrických a iných funkcií:

sin(4)
ans =
   -0.7568
sin(3*pi)+cos(1.23)^2
ans =
    0.1117
log(2430)
ans =
    7.7956

Aký základ používa funkcia log? Pomôže nám nápoveda

help log
 LOG    Natural logarithm.
    LOG(X) is the natural logarithm of the elements of X.
    Complex results are produced if X is not positive.
 
    See also LOG1P, LOG2, LOG10, EXP, LOGM, REALLOG.

    Reference page in Help browser
       doc log

Dokonalejšia nápoveda je hypertextová nápoveda prístupná cez tlačítko Start > Help alebo cez tlačítko so znakom '?' v modrom krúžku na toolbare pod menu. O funkciách sa dá ľahko zistiť nápoveda cez tlačítko fx vedľa promptu v príkazovom okne Command Window. Ďalšími možnosťami sú demo-videa a demo príklady.

Aritmetické operácie s maticami

Bežné aritmetické operácie ale i delenie maticou!

Štandardné operácie

Ak výraz končí bodkočiarkou ';', tak sa jeho výsledok nezobrazí. Sčítanie, odčítanie

A = [1 2 3; 2 3 1; 0 7 3];
B = [1 1 1; 3 2 1; 7 6 5];
C = [3 3; 3 3; 4 3];
whos
  Name           Size            Bytes  Class     Attributes

  A              3x3                72  double              
  B              3x3                72  double              
  C              3x2                48  double              
  CoJeTo         1x1                 8  double              
  D              3x2                48  double              
  a              1x1                 8  double              
  ans            1x1                 8  double              
  b              3x1                24  double              
  idx            1x3                24  double              
  nekonecno      1x1                 8  double              
  nula           1x1                 8  double              
  t              1x32              256  double              
  tab            1x32              256  double              
  u              2x3                48  double              
  x              1x3                24  double              
  y              2x1                16  double              
  z              2x3                48  double              

A+B
ans =
     2     3     4
     5     5     2
     7    13     8
A-B
ans =
     0     1     2
    -1     1     0
    -7     1    -2

Príkaz A+C; spôsobí chybové hlásenie

Error using ==> plus
Matrix dimensions must agree.
Error in ==> Uvod at 124

Maticové násobenie:

D = A*C
D =
    21    18
    19    18
    33    30
A*B
ans =
    28    23    18
    18    14    10
    42    32    22
B
B =
     1     1     1
     3     2     1
     7     6     5

Násobenie skalárom:

3*B
ans =
     3     3     3
     9     6     3
    21    18    15

Násobenie po zložkách .*:

A.*B
ans =
     1     2     3
     6     6     1
     0    42    15

Transpozícia matice

Pre maticu reálnych čísel A je A' transponovaná matica k matici A.

A = [ 1 2 3; 4 5 6]
A =
     1     2     3
     4     5     6
A'
ans =
     1     4
     2     5
     3     6

V skutočnosti je A' matica (komplexne) konjugovaná k matici A, to znamená, že ak A obsahuje komplexné čísla s nenulovou imaginárnou časťou, tak po transpozícii sú u imaginárnych častí opačné znamienka

B = A+i*(rand(2,3)-0.5)
B =
   1.0000 + 0.0470i   2.0000 + 0.2447i   3.0000 + 0.1868i
   4.0000 - 0.2037i   5.0000 - 0.3110i   6.0000 - 0.3165i
B'
ans =
   1.0000 - 0.0470i   4.0000 + 0.2037i
   2.0000 - 0.2447i   5.0000 + 0.3110i
   3.0000 - 0.1868i   6.0000 + 0.3165i

Ak aj v prípade komplexných čísel potrebujeme iba transponovanú maticu bez zmeny znamienok, tak sa pred apostrof vloží bodka:

B.'
ans =
   1.0000 + 0.0470i   4.0000 - 0.2037i
   2.0000 + 0.2447i   5.0000 - 0.3110i
   3.0000 + 0.1868i   6.0000 - 0.3165i

Generovanie matíc

zeros(m,n) je nulová matica mxn

zeros(2,3)
ans =
     0     0     0
     0     0     0

ones(m,n) je matica mxn obsahujúca samé jedničky

ones(2,3)
ans =
     1     1     1
     1     1     1

eye(n) je jednotková matica nxn

eye(3)
ans =
     1     0     0
     0     1     0
     0     0     1

diag(v) je diagonálna matica, ktorá je nulová a na diagonále sú prvky z vektora v

diag([1,2,3])
ans =
     1     0     0
     0     2     0
     0     0     3

Riešenie sústavy lineárnych rovníc "delením maticou"

Ak matica A nie je singulárna, tak sústava rovníc

$$Ax=b$$

má riešenie

$$x=A^{-1}b$$

V MATLABe je na to operátor "delenia zľava" vo forma opačného lomítka. Najprv vygenerujeme náhodnú maticu A

A=rand(3,3)
A =
    0.3685    0.0811    0.4868
    0.6256    0.9294    0.4359
    0.7802    0.7757    0.4468

Náhodný vektor b

b=rand(3,1)
b =
    0.3063
    0.5085
    0.5108

Potom sústavu

$$Ax=b$$

vyriešime:

x=A\b
x =
    0.1895
    0.2080
    0.4512

Výsledok (získaný iteratívnou numerickou metódou) skontrolujeme:

A*x-b
ans =
  1.0e-015 *
    0.0555
   -0.1110
         0

Generovanie vektorov

Pre rôzne účely sú často treba vektory reprezentujúce lineárne a iné typy postupností.

Rastúca postupnosť celých čísel od A do B sa vygeneruje zápisom A:B

t = 1:6
t =
     1     2     3     4     5     6

Jedná sa o aritmetickú postupnosť, veľkosť kroku môže byť ľubovoľná Napríklad postupnosť od A do B s krokom Krok sa zapíše ako A:Krok:B

t=-1:0.2:1
t =
  Columns 1 through 7
   -1.0000   -0.8000   -0.6000   -0.4000   -0.2000         0    0.2000
  Columns 8 through 11
    0.4000    0.6000    0.8000    1.0000

Aj negatívny krok je možný

t = 20:-3:1
t =
    20    17    14    11     8     5     2

Podobne funguje funkcia linspace(A,B,N), ktorá vráti N čísel, ktoré interval

$$<A,B>$$

rozdelia rovnomerne na N-1 dielikov.

linspace(0,1,11)
ans =
  Columns 1 through 7
         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000
  Columns 8 through 11
    0.7000    0.8000    0.9000    1.0000

Logaritmickú postupnosť medzi 10^A a 10^B generuje funkcia logspace(A,B,N)

logspace(1,6,7)
ans =
  1.0e+006 *
    0.0000    0.0001    0.0005    0.0032    0.0215    0.1468    1.0000

Vektorizované funkcie

Pokiaľ je to zmysluplné, tak všetky funkcie v MATLABe sú tzv. vektorizované. To znamená, že je možné im ako argument dať vektor a výsledkom bude aplikácia funkcie na každý prvok vektora. Napríklad tabuľka funkcie sin(2t) na intervale

$$ <0 ,\pi>$$

 t = 0:0.1:pi
t =
  Columns 1 through 7
         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000
  Columns 8 through 14
    0.7000    0.8000    0.9000    1.0000    1.1000    1.2000    1.3000
  Columns 15 through 21
    1.4000    1.5000    1.6000    1.7000    1.8000    1.9000    2.0000
  Columns 22 through 28
    2.1000    2.2000    2.3000    2.4000    2.5000    2.6000    2.7000
  Columns 29 through 32
    2.8000    2.9000    3.0000    3.1000
tab = sin(2*t)
tab =
  Columns 1 through 7
         0    0.1987    0.3894    0.5646    0.7174    0.8415    0.9320
  Columns 8 through 14
    0.9854    0.9996    0.9738    0.9093    0.8085    0.6755    0.5155
  Columns 15 through 21
    0.3350    0.1411   -0.0584   -0.2555   -0.4425   -0.6119   -0.7568
  Columns 22 through 28
   -0.8716   -0.9516   -0.9937   -0.9962   -0.9589   -0.8835   -0.7728
  Columns 29 through 32
   -0.6313   -0.4646   -0.2794   -0.0831

Graf tejto funkcie potom môžeme jednoducho zobraziť

plot(t,tab)

Pozor na násobenie a umocňovanie. Typicky potrebujeme výpočet po zložkách. Príklad: výpočet funkcie

$$1/(1+x^2)$$

x = -2:0.1:2;
y = 1./(1+x.^2);
plot(x,y)

Kreslenie grafov

MATLAB umožňuje kresliť 2D i 3D grafy. Už sme videli kreslenie 2D grafu pomocou funkcie plot(x,y). Táto funkcia je rozšírená. Tretí parameter udáva paremetre zobrazenia grafu. Napríklad farbu grafu - červený graf:

plot(x,y,'r')

Zelený graf čiarkovaný:

plot(x,y,'g--')

Bez spojovania zobrazených bodov. Body v tvare krúžkov:

plot(x,y,'o')

Bez spojovania zobrazených bodov. Body v tvare krížikov:

plot(x,y,'+')

Ďalšie možnosti viz nápoveda funkcie plot.

Popisy grafu je možné meniť. xlabel('string') a ylabel('string') zmenia popisy x-ovej a y-ovej osy grafu.

xlabel('x hodnoty');
ylabel('1/(1+x^2)');
plot(x,y)

grid pridá do grafu pravouhlú mriežku. hold on "podrží" graf a dovolí pridávať do obrázku grafy ďalších funkcií

hold on
plot(x,sin(x))

hold off ukončí "držanie" grafu.

hold off

Viacej grafov je možné nakresliť aj pridaním ďalších parametrov do volania plot.

plot(x,y,'r+--',x,sin(x),'go:')

Ďalšie užitočné príkazy

max(x) v prípade, že x je vektor, tak je to jeho maximálny prvok. Ak je x matica, tak vráti maximálne prvky v jednotlivých stĺpcoch. Ďalšie možnosti sú popísané v nápovede.

x
x =
  Columns 1 through 7
   -2.0000   -1.9000   -1.8000   -1.7000   -1.6000   -1.5000   -1.4000
  Columns 8 through 14
   -1.3000   -1.2000   -1.1000   -1.0000   -0.9000   -0.8000   -0.7000
  Columns 15 through 21
   -0.6000   -0.5000   -0.4000   -0.3000   -0.2000   -0.1000         0
  Columns 22 through 28
    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000
  Columns 29 through 35
    0.8000    0.9000    1.0000    1.1000    1.2000    1.3000    1.4000
  Columns 36 through 41
    1.5000    1.6000    1.7000    1.8000    1.9000    2.0000
max([2, -33.1,14,9])
ans =
    14
A
A =
    0.3685    0.0811    0.4868
    0.6256    0.9294    0.4359
    0.7802    0.7757    0.4468
max(A)
ans =
    0.7802    0.9294    0.4868

Podobne funguje min(x).

abs(x) počíta absolútnu hodnotu prvkov z x.

abs([1, -3,-4, 2])
ans =
     1     3     4     2

size(x) vráti vektor s rozmermi matice x v jednotlivých dimenziách

size(D)
ans =
     3     2

length(x) vráti "dĺžku" poľa x, tj. max(size(x)).

length(D)
ans =
     3

save fname uloží stav všetkých definovaných premenných do súboru fname.mat save 'c:\MatLab\Tst.mat'

save fname var1 var2 uloží iba obsahy vymenovaných premenných

load fname načíta obsah premenných zo súboru fname.mat.

quit ukončí MATLAB

Práca s prvkami matíc

C
C =
     3     3
     3     3
     4     3
C(2,1)
ans =
     3

Druhý riadok matice C

C(2,:)
ans =
     3     3

Druhý a tretí riadok matice C

C(2:3,:)
ans =
     3     3
     4     3

Prvý stĺpec matice C

C(:,1)
ans =
     3
     3
     4

Vybrané prvky vektora

x=0:2:14
x =
     0     2     4     6     8    10    12    14
idx = [ 3 1 4];
x(idx)
ans =
     4     0     6

Takéto indexovanie je možné využiť i na zmenu prvkov v matici (vektore)

x(idx)=[1,2,3]
x =
     2     2     1     3     8    10    12    14

Formát výstupu

Štandardne MATLAB vypisuje čísla na obmedzený počet platných číslic (5) a medzi riadky výstupu vkladá často prázdne riadky. To sa dá zmeniť. Väčší počet platných číslic získame príkazom

format long
A
A =
   0.368484596490336   0.081125768865785   0.486791632403172
   0.625618560729690   0.929385970968730   0.435858588580919
   0.780227435151377   0.775712678608402   0.446783749429806

Je možné si vynútiť exponenciálny tvar zápisu čísel

format long e
A
A =
  Columns 1 through 2
    3.684845964903365e-001    8.112576886578526e-002
    6.256185607296904e-001    9.293859709687300e-001
    7.802274351513768e-001    7.757126786084023e-001
  Column 3
    4.867916324031724e-001
    4.358585885809191e-001
    4.467837494298063e-001

Alebo krátky zápis v exponenciálnom tvare

format short e
A
A =
  3.6848e-001  8.1126e-002  4.8679e-001
  6.2562e-001  9.2939e-001  4.3586e-001
  7.8023e-001  7.7571e-001  4.4678e-001

Alebo krátky zápis bez vynúteného exponenciálneho tvaru - ak je to nutné, tak sa exponenciálny tvar použije, inak nie

format short
A
A =
    0.3685    0.0811    0.4868
    0.6256    0.9294    0.4359
    0.7802    0.7757    0.4468

Ale za najužitočnejšie považujem možnosť vynechať zbytočné prázdne riadky na výstupe a výstup "skompaktniť"

format compact
A
A =
    0.3685    0.0811    0.4868
    0.6256    0.9294    0.4359
    0.7802    0.7757    0.4468

Ďalšie možnosti - budú predstavené na ďalšom cvičení

Úloha

Nakreslite "žblunknutie kameňa do vody" ako 3D-graf funkcie dvoch premenných. Vlny by sa mohli počítať ako sin(vzdialenosť od počiatku súradníc). So vzdialenosťou od počiatku súradníc by výška vĺn mala klesať.