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 (-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ší
- > väčší
- <= menší alebo rovný
- >= väčší alebo rovný
- == rovná sa
- ~= nerovná sa
Podmienky sa môžu spojovať pomocou logických spojok
- & a (and)
- | alebo (or)
- ~ negácia (not)
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
- buď ako skripty
- 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