Professional Documents
Culture Documents
dk matice
Matlab disponuje dkmi maticemi, kter obsahuj mal pomr nenulovch prvk
oproti nulovm. Tato charakteristika poskytuje vhody pi ukldn matic z hlediska spory
msta, pamti a asu.
V tto kapitole se seznmme jak vytvoit dkou matici v Matlabu, a jak je pout pi
vpotech.
Funkce pro prci a tvoen dkch matic jsou umstny v SPARSFUN adresi
v Matlab toolbox adresi.
Pm vytvoen matice
Meme rovn vytvoit dkou matici pmo.
S = sparse (i,j,s,m,n)
i
j
s
m
a
vektor dk
vektor sloupc
vektor nenulovch hodnot
skuten poet dk
skuten poet sloupc
2
Vcerozmrn matice
V tto kapitole rozebereme problematiku vcerozmrnch matic s rozmry vtmi ne
2-D. Vcerozmrn pole mohou bt numerick, znakov, bunn, nebo strukturln pole.
Vcerozmrn matice jsou vestrann uiten napklad v reprezentaci vcevarianch dat, nebo etn strnky dvourozmrnch matic.
Dvourozmrn matice
Trozmrn matice
Bunn pole
Bunn pole v Matlabu jsou pole ve, kterch jsou jednotliv elementy buky, obaly,
kter mohou podret dal Matlabovsk pole. Napklad jedna buka bunnho pole sm
obsahovat relnou matici, dal pole obsahuje textov string, dal vektor komplexnch sel
atd..
Znaky a texty
V tto kapitole zjistme e doplkem matlabu jsou rovn etzcov data. Vysvtlme
si jak vytvoit znakov a bunn pole z etzce. Bude zde rovn ukzno jak jednodue
pevst i upravit bn etzec, jako napklad najt nebo pemstit, ppadn zkonvertovat
etzec do selnho formtu.
Funkce pro prci s etzci jsou uloeny v adresi STRFUN v Matlab toolboxu.
V MAtlabu je termn string (etzec) chpn jako pole znak. Matlab si intern ukld
tyto znaky pod selnm oznaenm. Tak napklad
name = Jozef Novk;
Vytvo 1 13 znak pole naznan name.
Monm pstupem jak vytvoit znakov etzec je pouit CHAR funkce, kter vytvo string
ze vech etzc tak, e vezme ten nejdel z nich a nsledn upravuje i dlku ostatnch tm e
je dopln mezerami.
Pro zskn etzce z matice , je vhodn pout funkci pro vyjmut DEBLANK:
trimname = deblank(name(1,:))
trimname =
Thomas R. Lee
size(trimname)
ans =
1 13
9
Porovnvn etzc
Matlab disponuje funkcemi pro porovnvn etzc:
STRCMP
STRNCMP
Str2num
Mat2str
Zznamy
Zznam (struktury) jsou v Matlabu pole nazvan datov kontejner neboli daj. Tento daj o zznamu me
obsahovat jakkoli druh dat. Tak napklad, jeden daj pole obsahuje textov etzec reprezentujc jmno, dal
me obsahovat skalr stka faktury, a dal matici lkaskch zznam - vsledk test a tak podobn.
Vytven struktur
Strukturu meme vytvoit dvma zpsoby:
1. Pouitm pidlen vrazu
2. Uitm funkc STRUCT
1.
pokud napeme
patient
11
pro ten
pro zpis
pro pipsn
r+
Systmy jako nap. VMS, kter rozliuj mezi textovmi a binrnmi soubory, mohou poadovat dodaten
znaky v pstupovm etzci, nap. rb pro oteven binrnho souboru pro ten.
Funkce fopen vrac identifiktor souboru, co je nezporn cel slo piazen souboru operanm systmem.
Identifiktor souboru, co je nezporn cel slo piazen souboru operanm systmem. Identifiktor souboru
je v podstat zkratkou pro odkaz na soubor. Funkce MATLABu pro souborov vstup a vstup pouvaj
identifiktor souboru pro rozlien, s jakm souborem se m pracovat ( otevt, st, zapisovat, zavt ).
Jestlie neme bt soubor oteven ( nap. pokus o oteven neexistujcho souboru pro ten ), vrac fopen jako
identifiktor souboru hodnotu -1. Je dobrm zvykem ihned po oteven souboru otestovat identifiktor souboru.
Druh vrcen hodnota poskytuje doplujc informaci o chyb. Nap. pokud MATLAB neme najt soubor
pen.dat, pkaz
[fid, message] = fopen(pen.dat, r)
14
short a long
15
float a double
32 a 64
Kompletn seznam pouitelnch pesnost viz. fread ve druhm dlu tto knihy, Popis funkc.
Pokud se fid odkazuje na oteven soubor obsahujc reln hodnoty, potom
A = fread(fid, 10, float)
nate 10 relnch sel s jednoduchou pesnost do sloupcovho vektoru A.
Nsledujc pklad otevr soubor obsahujc popis funkce fread, potom jej nate a cel soubor zobraz.
freadid = fopen(fread.m, r);
F = fread(freadid, Inf, uchar);
disp(setstr(F))
status = fclose(freadid);
Oznamujeme, e pkaz fread v tto ukzce je ekvivalentn pkazu
F = fread(freadid);
Zpis binrnch datovch soubor
Funkce fwrite zapisuje prvky matice do souboru ve specifikovan numerick pesnosti; funkce vrac poet
zapsanch hodnot. Nap.
fwriteid = fopen(magic5.bin, w);
count = fwrite(fwriteid, magic(5), integer*4);
status = fclose(fwriteid);
Vytvo 100-bytovch binrn soubor obsahujc 25 prvk ( magnetick tverec 5 x 5 ) uloench jako 4-bytov
cel sla. Promnn count se nastav na 25.
Ovldn pozice v souboru
Funkce fseek resp. ftell nm umon nastavit resp. dotzat se na pozici v souboru, se kterou bude pracovat pt
vstupn nebo vstupn operace.
Funkce ftell vrac polohu ( v bytech ) ukazovtka pozice v souboru, kter vstupuje do funkce jako jej argument.
Funkce fseek zmn polohu ukazovtka pozice v souboru. To nm umon peskoit data nebo se navrtit
k dvj sti souboru. Argumenty tto funkce jsou identifiktor souboru; kladn nebo zporn hodnota posunu
( v bytech ), kter uruje, zda dojde k posunu vped i vzad; a potek , od kterho se provd vpoet posunu.
Potek me bt aktuln pozice v souboru (cof), zatek (bof) i konec (eof) souboru.
V nsledujcm pkladu se do souboru five.bin zap sla 1 a 5 ( jako dvoubytov cel sla ), po
znovuoteven souboru se prvnm volnm fseek pesko prvnch 6 byt ( obsahuj sla 1, 2 a 3 ), prvnm
volnm fread se pete hodnota 4, pozice vrac byty zpt a nsledn fread pete hodnotu 3.
A = [1:5];
fid = fopen(five.bin, w);
fwrite(fid, A, short);
status = fclose(fid);
fid = fopen(five.bin, r);
status = fseek(fid, 6, bof);
four = fread(fid, 1, short);
16
position = ftell(fid) ;
status = fseek(fid, -4, cof);
three = fread(fid, 1, short);
status = fclose(fid);
Zpis formtovanch textovch soubor a etzc
Funkce fprintf konvertuje data na znakov etzce a posl je na obrazovku nebo do souboru. Vstupn formt je
uren formtovacm etzcem, kter obsahuje konvergentn specifiktory a text. Konverzn specifiktory zanaj
znakem %; bn konverze zahrnuj
%e
%f
%g
%d
%f
dn znaky ve formtovacm etzci jsou jeden za druhm vyhledvny ve vstupu a na to, e jeden oddlovac
znak ( white space ) odpovd libovolnmu etzci oddlovacch znak. Jak se te vstup, MATLAB pizpsobuje
dc etzec vstupu a vrac datov hodnoty zkonvertovan podle formtovacch specifiktor. Nsledujc
pklad te soubor s exponencilnmi daty, kter byl vytvoen dve:
fid =fopen(exptable.txt, r);
17
Pbuzn funkce sscanf bere svj vstup z etzce msto ze souboru. Nap.
rootvalues = sscanf(root2,The square root of %f is %f.);
vrac sloupcov vektor obsahujc hodnotu 2 a jej druhou odmocninu.
Skriptov soubory
Kdy je sputn skript, MATLAB jednodue spout pkazy, kter nalezne v souboru. Pkazy ve skriptovm
souboru operuj globln s daty v pracovnm prostoru. Skripty jsou uiten k proveden analz, een problm
18
nebo konstruovn dlouhch posloupnost pkaz, kter se interaktivn daj dlat jenom tkopdn
a zdlouhav.
Nap. pdpokldejme, e soubor fibno.m obsahuje pkazy:
% M-soubor pro vpoet Fibonacciho sel
f=[1 1]; i=1;
while f (i)+ f (i+1)<1000
f (i+2)= f (i)+ f (i+1);
i=i+1;
end
plot(f)
Zadnm pkazu fibno, MATLAB provede pkazy v tomto souboru a vypote tak prvnch estnct Fibonacciho
sel a vytvo jejich graf. Po ukonen vpotu zstvaj promnn f a i v pracovnm prostoru.
Demonstran pklady, kter se dodvaj s MATLABem jsou dobrou ukzkou, jak lze skript pout pro een
sloitjch loh. Zkuste si to, zadejte demos.
Kdy spustte MATLAB, automaticky se spust skript s nzvem startup.m. Do nho si mete zadat fyzikln
konstanty, inenrsk konverze nebo cokoli jinho, co chcete mt peddefinovno ve vaem pracovnm
prostoru. Na vce uivatelskch sovch systmech je skript matlabrc.m rezervovn pro systmov
manager.
Funkn soubory
M-soubor, kter obsahuje slovo function na zatku prvn dky, je funkn soubor.
Funkce se li od scriptu v nsledujcm:
Funkn soubory jsou vznamn pro rozen MATLABu, tj. vytvoen novch funkc
MATLABu za pouit jazyka MATLABU samotnho.
Zde je jednoduch pklad. Soubor mean.m , dodvan s MATLABem, obsahuje pkazy:
function y = mean(x)
% MEAN Average or mean value.
% For vectors, MEAN(X) is the mean value of the elements in X.
% For matrices, MEAN(X) is a row vector containing the mean value
% of each column.
%
% See also MEDIAN, STD, MIN, MAX.
% Copyright (c) 1984 -94 by The MathWorks, Inc.
[m,n] = size(x);
if m == 1
m = n;
end
19
y = sum(x)/m;
Existence tohoto souboru zrove definuje novou funkci zvanou mean. Tato nov
funkce mean se pouv prv tak, jako kterkoli jin funkce MATLABu. Nap. jej vektor
celch sel od 1 do 99,
z = 1:99;
pak stedn hodnotu naleznete zadnm
mean (z)
co d
ans =
50
Zde jsou nkter podrobnosti k mean.m:
Prvn dka deklaruje nzev funkce, vstupn argumenty a vstupn argumenty. Bez
tto dky by byl tento soubor skriptem a ne funkc.
Znak % oznauje, e zbytek dky je koment, kter je ignorovn.
Nkolik prvnch komentovch dek popisuje M-soubor a zobraz se, kdy zadte
help mean .
Prvn komentov dka, znm jako dka H1, je zahrnuta do souboru
contents.m, kter se nachz v kadm pbuznm adresi MATLABu, a pouv
ji pkaz lookfor.
Promnn x, m, n a y jsou lokln vzhledem k mean a neexistuj v pracovnm
prostoru. (Pokud v pracovnm prostoru existovaly ped sputnm funkce mean,
zstanou nezmnny.)
Nyn vytvome o trochu sloitj verzi funkce mean nazvanou stat. Tato funkce vypote
navc standartn odchylku:
function [mean,stdev] = stat(x)
[m,n] = size(x);
if m == 1
m = n;
end
mean = sum(x)/m;
stdev = sqrt(sum(x.^2)/m-mean.^2);
Funkce stat ilustruje monost vrcen vce vstupnch argument.
Funkce, kter vypote hodnost matice, uv naopak vce vstupnch argument:
function r=rank(X,tol)
% hodnost matice
20
s = svd(X);
if (nargin == 1)
tol = max(size(X))*s(1)*eps;
end
r = sum(s>tol);
Tento pklad demostruje pouit pernamentn promnn nargin k zskn potu vstupnch
argument. Promnn nargout, zde nepouit, obsahuje poet vstupnch argument.
Globln promnn
Obvykle kad funkce MATLABu, definovan jako M-soubor, m sv vlastn lokln
promnn, kter jsou oddlen od loklnch promnnch jinch funkc a od promnnch
zkladnho pracovnho prostoru. Pokud vak nkolik funkc pop.zkladn prostor deklaruj
nzev promnn jako globln, potom spolen sdlej jednu kopii tto promnn.
Globln promnn se obvykle z dvodu lep itelnosti M-soubor p velkmi psmeny.
Pedpokldejme e chceme studovat vliv vazebnch koeficient a v Lotkeho Volterrov
modelu dravce a koisti
y&1 y1 * y1 * y 2
y&2 y 2 * y1 * y 2
Textov etzce
Textov etzce se do MATLABu zadvaj v apostrofech.Nap.
s = Hello
vrt
s=
Hello
Text je uloen ve vektoru, co znak to prvek. V naem ppad
size(s)
ans =
1 5
Oznamuje, e s m pt prvk (pt znak). Znaky jsou uloeny jako ASCII hodnoty a funkce
abs tyto hodnoty (poad v tabulce ASCII znak) uke:
abs(s)
ans =
72
101
108
108
111
Funkce setstr nastav zobrazovac md vektoru tak, aby zobrazoval text uloen ve vektoru a
ne odpovdajc ASCII hodnoty. Funkce disp zobraz text v promnn, funkce isstr detekuje
etzce a funkce strcmp etzce porovnv.
Pouitm hranatch zvorek mete textov promnn spojovat do velkch etzc:
s = [s,World]
s=
Hello World
sla se pevd na etzce funkcemi sprintf, num2str a int2str.Pro vloen popisu grafu,
kter obsahuje seln hodnoty, se asto petransformovan sla spojuj do velkch etzc:
f = 70; c = (f-32)/1.8;
22
23
t = 0:0.01:100;
y = sin(t);
anebo pmo
y = sin(0:0.01:100);
Na pomalm potai trval prvn pklad 10.4 sekundy, zatmco druh pouze 0.16
sekundy, tedy 65-krt rychleji. Pi sloitjm kdu nen vdy snadn zjistit, jakm
zpsobem kd optimalizovat. Avak pokud je pro vs rychlost dleit, budete muset
vdy hledat cestu jak v algoritmus vektorizovat.
Pokud st svho kdu vektorizovat nemete, mte jet jednu monost jak provdn
svch cykl for urychlit: provst pedbnou alokaci vektor, do kterch se v cyklu
ukldaj vsledky. Nap prvn pkazy nsledujcm pkladu znan urychl proveden
cyklu for:
y=zeros(1,100);
for i=1:100
y(i)=det(X^i);
end
Pokud by nebyla provedena pedbn alokace vektoru y, musel by interpretem
MATLABu zvtovat velikost vektoru y pi kadm prchodu cyklem o jeden prvek
a tm by se vpoet znan zpomalil.
Pokud pracujete s velikmi maticemi na potach s relativn malou pamti, m pro
vs metoda pedbn alokace jet jednu vhodu: efektivnj vyuit pamti.
V prbhu prce s MATLABem dochz k fragmentaci pamti. I kdy mte relativn
dosti volnho msta v pamti, nemuste jet mt dost spojitho prostoru pro uloen
velk promnn. Pedbn alokace pomh redukovat fragmentaci pamti.
dc struktury
MATLAB obsahuje dc struktury, jak se nachzej ve vtin programovacch jazyk. Existence tchto
struktur povyuje MATLAB z obyejnho kalkultoru na plnohodnotn vy programovac jazyk.
Cyklus FOR
MATLAB m svoji vlastn verzi cyklu DO nebo FOR, kter se nachz v jinch programovacch jazycch.
Cyklus FOR slou pro pedem dan poet opakovn pkazu nebo skupiny pkaz.
nap.
for i=1:n, x(i)=0, end
Piad nulu prvnm n prvkm vektoru x. Je-li n men ne jedna, bude pkaz stle legln, ale vnitn pkaz
nebude proveden. Pokud x jet neexistuje nebo m mn ne n prvk, potom se automaticky alokuje dodaten
prostor.
Cykly meme vnoovat; z dvodu lep itelnosti se obvykle odsazuj. Nap.
for i=1:m
for j=1:n
A(i,j)=1/(i+j-1);
end
end
A
24
Stednk ukonujc vnitn pkaz potlauje zobrazovn mezivsledk, zatmco A nsledujc po cyklech
zobraz konen vsledek.
Pozor, kad for mus mt svj end. Jestlie zadte
for i=1:n, x(i)=0
systm ek, a zadte zbvajc pkazy do tla cyklu. Nic se nedje, dokud nezadte end.
Pro nsledujc pklad pedpokldejme, e
t=
-1
0
1
3
5
a e chcete vytvoit Vandermondeovu matici, co je matice, jej sloupce jsou mocniny vektoru t.
A=
1 -1 1
0
0 0
1
1
1
81 27 9
625 125 25
-1
0
1
3
5
1
1
1
1
1
Cyklus WHILE
MATLAB m svoji vlastn verzi cyklu while, kter umouje opakovat pkaz nebo skupinu pkaz v zvislosti
na logick podmnce. Zde je jednoduch problm na ilustraci cyklu while. Jak prvn cel slo n m svj
faktoril stocifern? Nsledujc cyklus while ho najde. Pokud ji neznte odpov, zadejte
n=1;
while prod(1:n)<1.0e100, n=n+1; end
n
Praktitjm vpotem ilustrujcm pouit while je vpoet exponenciln funkce matice; v MATLABu
nazvan expm(A). Jednou z monch definic exponenciln funkce je mocninn ada:
expm(A) = I + A + A^2/2! + A^3/3! + ...
Obecn tvar cyklu while je
while vraz
pkazy
end
Pkazy se opakuj tak dlouho, dokud jsou vechny prvky ve vrazu (vraz je matice) nenulov. Vraz je tm
vdy skalrnm relanm vrazem, take nenulov hodnoty odpovdaj logick hodnot TRUE. Pokud vraz nen
skalr, mete ho redukovat funkc any nebo all.
Pkazy IF a BREAK
Nsledujc pkazy ilustruj pouit pkazu if. Prvn pklad ukazuje, jak me bt vpoet rozdlen na ti
ppady v zvislosti na znamnku a parit promnn n.
if n<0
A=negative(n)
elseif rem(n,2)==0
A=even(n)
else
A=odd(n)
end
Druh pklad pojednv o vzruujcm problmu z teorie sel. Mjme libovoln kladn cel slo. Pokud je
sud, dlme ho dvma. Pokud je lich, nsobme ho temi a pitme jedniku. Tento postup opakujme, dokud
nedostaneme jedniku. Problm zn: Existuje njak cel slo, pro kter tento proces nikdy nekon?
Nsledujc program ilustruje hlavn pkazy while a if. Dle ukazuje pouit funkce input, kter slou pro
vstup z klvesnice, a pkazu break, kter peru provdn nejble nadazenho cyklu.
% Klasick problm 3n+1 z teorie sel
while 1
n=input(Zadej n, zporn=konec );
if n<=0, break, end
while n>1
if rem(n,2)==0
n=n/2;
else
n=3*n+1;
end
end
end
26
SWITCH
Switch provd jist pkaz zakldajc se na hodnot nebo vrazu, kter je piazen
v seznamu oekvanch vstup.
nebo
27
+
*
.*
^
.^
kron
\
/
./
:
()
[]
.
..
...
,
;
%
!
`
.`
=
==
<>
&
~
xor
28