You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
MATLAB<br />
Osnove
Šta je MATLAB?<br />
• programsko okruženje za raĉunanje u tehnici<br />
– u osnovi je matematiĉki alat<br />
– ima veliku primenu u primenjenim disciplinama - inženjerstvu<br />
• poseduje visoke performanse u numeriĉkim izraĉunavanjima i<br />
vizuelizaciji podataka<br />
• <strong>Matlab</strong> je interpreter i programski jezik<br />
– pruža i interaktivni rad i batch-obradu<br />
• osnovni elemenat je matrica koja ne zahteva dimenzionisanje<br />
– većina problema se jednostavno rešava u odnosu na programske<br />
jezike poput Fortran-a, Pascal-a, C-a, ...<br />
– nazvan je prema matrix laboratory
Osnovne osobine<br />
• Jezik visokog nivoa za tehniĉko raĉunanje<br />
• Razvojno okruženje za upravljanje programskim kodom, datotekama<br />
i podacima<br />
• Interaktivni alati za iterativno istraživanje, dizajn i rešavanje<br />
problema<br />
• Biblioteka matematičkih funkcija iz linearne algebre, statistike,<br />
Forijeove analize, fitriranja, optimizacije, numeriĉke integracije<br />
• 2D i 3D grafičke funkcije za prikaz podataka<br />
• Alati za kreiranje korisničkog interfejsa<br />
• Funkcije za integraciju MATLAB algoritama sa spoljašnjim<br />
aplikacijama i programskim jezicima: Fortran, C, C++, Java, COM, i<br />
Microsoft Excel
• na Univerzitetima je alat za obuku<br />
Primena<br />
• u industriji se upotrebljava za istraživanje i<br />
rešavanje praktiĉnih inženjerskih i matematiĉkih<br />
problema<br />
• tipiĉna upotreba pokriva:<br />
– Matematiku i numeriku<br />
– Razvoj algoritama<br />
– Modeliranje, simulaciju i razvoj prototipova<br />
– Analizu podataka, istraživanja i vizuelizaciju<br />
– Nauĉnu i inženjersku grafiku<br />
– Razvoj aplikacija, ukljuĉujući grafiĉki<br />
korisniĉki interfejs<br />
• poseduje kolekcije metoda (alata, rešenja)<br />
specifiĉnih za odreĊene oblasti - Toolbox-ovi
http://www.mathworks.com<br />
MATLAB familija proizvoda
Toolbox-ovi<br />
• Toolbox je kolekcija (biblioteka) izabranih<br />
funkcija (M-datoteka) namenjena rešavanju<br />
problema odreĊenje oblasti<br />
• oni proširuju mogućnosti <strong>Matlab</strong>-a<br />
• postoje toolbox-ovi za oblasti<br />
– analize signala<br />
– automatskog upravljanja<br />
– simulacije dinamiĉkog ponašanja sistema<br />
– identifikacije sistema<br />
– veštaĉkih neuronskih mreža<br />
– fuzzy sistema<br />
– optimizacije<br />
– analize robustnosti sistema<br />
– ...<br />
• postojeći toolbox-ovi se usavršavaju, a novi<br />
nastaju �<br />
Aerospace Toolbox<br />
Bioinformatics Toolbox �<br />
Communications Toolbox<br />
Control System Toolbox<br />
Curve Fitting Toolbox<br />
Data Acquisition Toolbox<br />
Database Toolbox<br />
Datafeed Toolbox<br />
Excel Link<br />
Filter Design Toolbox<br />
Filter Design HDL Coder<br />
Financial Toolbox<br />
Financial Derivatives Toolbox<br />
Fixed-Income Toolbox<br />
Fixed-Point Toolbox<br />
Fuzzy Logic Toolbox<br />
GARCH Toolbox<br />
Genetic Algorithm and Direct Search Toolbox<br />
Image Acquisition Toolbox<br />
Image Processing Toolbox<br />
Instrument Control Toolbox<br />
Mapping Toolbox<br />
Model-Based Calibration Toolbox<br />
Model Predictive Control Toolbox<br />
Neural Network Toolbox<br />
Optimization Toolbox<br />
OPC Toolbox<br />
Partial Differential Equation (PDE) Toolbox<br />
RF Toolbox<br />
Robust Control Toolbox<br />
Signal Processing Toolbox<br />
Spline Toolbox<br />
Statistics Toolbox<br />
Symbolic Math Toolbox<br />
System Identification Toolbox<br />
Virtual Reality Toolbox<br />
Wavelet Toolbox
Raĉunarske platforme<br />
• Podržane su brojne raĉunarske platforme<br />
• i operativni sistemi<br />
• kod pisan u <strong>Matlab</strong>-u je prenosiv, ukljuĉujući i aplikacije sa<br />
korisniĉkim interfejsom u obliku prozora<br />
Tekuća verzija MATLAB 7.3<br />
sastavni deo paketa R2006b od 1. septembra 2006
• Ĉine ga:<br />
Radno okruženje <strong>Matlab</strong>-a (nekad �)<br />
– komandni prozor (samo je jedan)<br />
– nekoliko grafiĉkih prozora<br />
– korisnikov editor za pisanje M-skript datoteka<br />
• Komandni prozor<br />
– je mesto gde se daju (kucaju) naredbe interpreteru i ispisuju rezultati<br />
– sekvencijalno prihvata i izvršava naredbe<br />
– poseduje linijski editor<br />
• Grafiĉki prozor<br />
– obiĉno prikazuje 2D i 3D dijagrame<br />
– više dijagrama se može prikazati u razliĉitim prozorima i/ili se jedan<br />
prozor može podeliti na nekoliko delova<br />
– automatski se pojavljuje kod izvršavanja grafiĉkih naredbi<br />
– sadržaj prozora se može odštampati na nekoliko naĉina
Radno okruženje <strong>Matlab</strong>-a (i sad �)<br />
Sastoji se od većeg broja prozora:<br />
• Command Window (ranije – komandni prozor)<br />
• Command History<br />
• Launch Pad<br />
• Help Browser<br />
• Current Directory Browser<br />
• Workspace Browser<br />
• Array Editor<br />
• Editor/Debugger<br />
Ostali alati:<br />
• UnapreĊen uvoz i izvoz podataka<br />
• Profiler – pomaže u otkrivanju uskih grla u aplikaciji<br />
• Podrška Source Control System-ima<br />
• Notebook – pristup <strong>Matlab</strong>-u iz programa za obradu teksta (MS Word)
Drugi naĉini povezivanja i prenosa podataka<br />
• prenos podataka preko datoteke (u binarnom ili ASCII formatu)<br />
• prenos teksta i grafike preko Windows Clipboard-a<br />
• povezivanje drugih aplikacija sa <strong>Matlab</strong>-om preko DDE (Dynamic<br />
Data Exchange) mehanizma<br />
(Tekuća verzija <strong>Matlab</strong>-a podržava COM (Component Object Model))<br />
<strong>Matlab</strong> može da radi kao:<br />
– server<br />
– klijent<br />
• <strong>Matlab</strong> poseduje biblioteku C i Fortran funkcija, C++ klasa<br />
– za rad sa <strong>Matlab</strong>-ovim datotekama podataka i za osnovne matriĉne<br />
operacije<br />
– mogu se upotrebiti za pisanje korisnikovih funkcija koje se<br />
pozivaju iz <strong>Matlab</strong>-ovog okruženja
<strong>Matlab</strong> promenljive<br />
• naziv promenljive ĉine slova i brojevi<br />
(mora poĉeti slovom)<br />
(prvih 19 (31 kod verzije �) znakova se uzima u obzir)<br />
• razlikuju se mala i velika slova (npr. a i A su dve promenljive)
• Oblik<br />
<strong>Matlab</strong> izraz<br />
promenljiva = izraz<br />
• izraz ĉine: nazivi promenljivih, funkcije, operatori i drugi specijalni<br />
znaci.<br />
• promenljiva je niz<br />
• ako se izostavi promenljiva sa leve strane znaka “=”, privremena<br />
promenljiva ans prima vrednost izraza<br />
• kod dugaĉkih izraza, kada je potrebno unos nastaviti u narednom redu,<br />
predhodni red završiti sa “...” (tri taĉke)<br />
• znak “;” na kraju izraza spreĉava da se ispiše vrednost promenljive
Brojevi<br />
• Realni 3 -99 0.0001 -9.639825 1.62e-20 -10.34e200<br />
– opseg od 2.2251*10 -308 do 1.7977*10 308<br />
• Kompleksni -4+7i 8i -9j -9*j 1.23-12e-4j<br />
– imaginarna jedinica je: i ili j<br />
– funkcije<br />
• realna vrednost broja real(z)<br />
• imaginarna vrednost broja imag(z)<br />
• konjugovano kompleksna<br />
vrednost conj(z)<br />
• moduo abs(z)<br />
• argument angle(z)<br />
– nizovi kompleksnih brojeva<br />
imag(z)<br />
abs(z)<br />
8+i9<br />
angle(z)<br />
real(z)<br />
conj(z)<br />
z
• Aritmetiĉke operacije:<br />
– sabiranje +<br />
– oduzimanje -<br />
– množenje *<br />
– delenje (levo) /<br />
– desno delenje \<br />
– stepenovanje ^<br />
Aritmetiĉke operacije<br />
• Redosled operacija je odreĊen na osnovu<br />
prioriteta:<br />
1. unarni minus<br />
2. stepenovanje<br />
3. množenje ili delenje<br />
4. sabiranje ili oduzimanje<br />
– upotrebom ( ) može se uticati na<br />
redosled izraĉunavanja<br />
» 4 \ 1<br />
ans =<br />
0.2500<br />
» 4 / 1<br />
ans =<br />
4<br />
» 1 + 3 * 2 ^ 4 / 6 - 9<br />
ans =<br />
0<br />
» 1 + (3 * 2) ^ 4 / (6 - 9)<br />
ans =<br />
- 431
• Posebni brojevi:<br />
– Ludolfov broj pi (3.1415...)<br />
– Imaginarna jedinica i ili j<br />
– beskonaĉna vrednost � Inf<br />
Posebni brojevi<br />
– neodreĊena vrednost (not a number) NaN<br />
– podrazumevana taĉnost eps (2.2204e-16)<br />
– “privremena” promenljiva ans<br />
– konstante opsega brojeva realmin i<br />
realmax<br />
• Delenje nulom ne prekida program,<br />
već nastaje vrednost Inf<br />
• NaN je rezultat neodreĊenih izraza<br />
– Inf/Inf ili<br />
– 0/0<br />
» 1 / 0<br />
Warning: Divide by zero<br />
ans =<br />
Inf<br />
» x = Inf / Inf<br />
x =<br />
NaN
Nizovi u <strong>Matlab</strong>-u<br />
• osnovni tip podataka je niz (Array)<br />
• skalar je niz dimenzije 1x1<br />
sliĉno je i sa vektorima u obliku kolone ili vrste<br />
• elemenat niza može biti kompleksan broj<br />
• niz se može tumaĉiti kao<br />
– niz koeficijenata polinoma<br />
– niz slova u string-u<br />
– bit-mapirana slika (dvodimenzioni niz)<br />
– zvuĉni zapis<br />
• podržan je rad sa retkim nizovima<br />
• dimenzije niza se ne unose<br />
• potreban memorijki prostor za niz se automatski zauzima (alocira)<br />
– veliĉina niza nije ograniĉena i može prevazići raspoloživi RAM<br />
raĉunara (zahvaljujući virtuelnoj memoriji)
• Unosom kao eksplicitna lista<br />
brojeva ili izraza<br />
• kao rezultat izvršavanja<br />
ugraĊene naredbe ili funkcije<br />
(<strong>Matlab</strong>-ove unutrašnje<br />
funkcije)<br />
• formiranjem u M-datoteci<br />
(<strong>Matlab</strong>-ovoj spoljašnjoj<br />
funkciji)<br />
• uĉitavanjem iz datoteke<br />
podataka<br />
Nastanak brojnog niza<br />
» a = [ 1 2 3; 4 5 6 ]<br />
a =<br />
1 2 3<br />
4 5 6<br />
» b = sum(a)<br />
b =<br />
5 7 9<br />
» save abdat a b<br />
» clear<br />
» b<br />
??? Undefined function or variable b.<br />
» load abdat<br />
» b<br />
b =<br />
5 7 9
Funkcije<br />
• Tip funkcije (nebitan za korisnika)<br />
– ugraĊena (unutrašnja, najbrže se izvršava)<br />
– M-datoteka iz MATLAB biblioteke (spoljašnja)<br />
– funkcija korisnika (spoljašnja, M-datoteka)<br />
• Grupe funckcija:<br />
– elementarne matematiĉke<br />
– specijalne funkcije<br />
– elementarne matriĉne<br />
– specijalne matrice<br />
– za dekompoziciju i faktorizaciju matrica<br />
– za analizu podataka<br />
– za rad sa polinomima<br />
– za rešavanje diferencijalnih jednaĉina<br />
– za optimizaciju i rad sa nelinearnm jednaĉinama<br />
– za numeriĉku integraciju<br />
– ...<br />
• pomoć o funkciji se dobija pomoću help ime_funkcije<br />
• svaki Toolbox dodaje nove funkcije
Poziv funkcije<br />
• funkcija se poziva njenim imenom,<br />
tj. imenom M-datoteke<br />
clc % brisanje ekrana<br />
• ako funkcija ima parametre navode<br />
se u malim zagradama ( ) razdvojeni<br />
zarezom<br />
• ako funkcija vraća vrednosti,<br />
promenljive koje ih prihvataju se<br />
navode u uglastim zagradama [ ]<br />
razdvojene zarezom<br />
• redosled parametara je bitan<br />
• ako funkcija dozvoljava, ne moraju<br />
se navesti svi parametri u pozivu<br />
i ne moraju se preuzeti sve vrednosti<br />
• ugnježdeni pozivi<br />
» atan2(-1,-1) == -pi + pi/4<br />
ans =<br />
1<br />
» x = [1 3 2];<br />
» a = max(x)<br />
a =<br />
3<br />
» [m,i] = max(x)<br />
m =<br />
3<br />
i =<br />
2<br />
» x = pi / 4;<br />
» log( cos( sin(x) + 1 ) - 5 )<br />
ans =<br />
1.6363 + 3.1416i
Matematiĉke funkcije<br />
• primenjuju se nad matricom elemenat po elemenat<br />
• trigonometrijske: sin cos tan asin acos atan atan2<br />
sinh cosh tanh asinh acosh atanh<br />
• neke elmentarne funkcije<br />
– apsolutna vrednost abs<br />
– kvadratni koren sqrt<br />
– signum sign<br />
– ostatak delenja rem(x,y)<br />
– exponencijalna exp<br />
– prirodni logaritam log<br />
– logaritam osnove 10 log10, osnove 2 log2<br />
• zaokruživanje vrednosti na celobrojnu<br />
– ka najbližem celom broju round<br />
– ka nuli fix<br />
– ka -� floor<br />
– ka +� ceil<br />
• specijalne funkcije: bessel, beta, gamma, ...<br />
» x=pi*[1/3 1/6];<br />
» y=sin(x)<br />
y =<br />
0.8660 0.5000<br />
» 2*y-1<br />
ans =<br />
0.7321 -0.0000<br />
» 2*y-1 >= 0<br />
ans =<br />
1 0<br />
» floor(2*y-1)<br />
ans =<br />
0 -1
• ima 15 ugraĊenih<br />
tipova podataka<br />
(klasa)<br />
• svaki tip je višedimenzioni niz<br />
Tipovi podataka<br />
– dvo-dimenzioni nizovi su matrice<br />
– sparse su retki nizovi<br />
• složene strukture podataka: cell i structure<br />
• numeric i array su virtuelni tipovi podataka, nose neke zajedniĉke<br />
osobine za izvedene tipove<br />
• korisnikov tip: user classes, Java classes
Tipovi podataka - primeri<br />
Tip Primer<br />
int8, uint8, int16, uint16(65000)<br />
uint16, int32,<br />
uint32, int64,<br />
uint64<br />
single single(3 * 10^38)<br />
double 3 * 10^300 5 + 6i<br />
logical magic(4) > 10<br />
char 'Hello'<br />
cell array a{1,1} = 12;<br />
a{1,2} = 'Red';<br />
a{1,3} = magic(4);<br />
structure a.day = 12;<br />
a.color = 'Red';<br />
a.mat = magic(3);<br />
function handle @sin<br />
user class polynom([0 -2 -5])<br />
Java class java.awt.Frame
Numeriĉki tipovi<br />
Tip Opseg M-funkcija<br />
Celobrojan<br />
Označen 8-bit integer -2 7 to 2 7 -1 int8<br />
Označen 16-bit integer -2 15 to 2 15 -1 int16<br />
Označen 32-bit integer -2 31 to 2 31 -1 int32<br />
Označen 64-bit integer -2 63 to 2 63 -1 int64<br />
Neoznačen 8-bit integer 0 to 2 8 -1 uint8<br />
Neoznačen 16-bit integer 0 to 2 16 -1 uint16<br />
Neoznačen 32-bit integer 0 to 2 32 -1 uint32<br />
Neoznačen 64-bit integer 0 to 2 64 -1 uint64<br />
U pokretnom zarezu<br />
Jedostruke preciznosti<br />
32-bit<br />
Dvostruke preciznosti<br />
64-bit<br />
-3.4 e 38 to<br />
3.4e 38<br />
IEEE<br />
Standard 754<br />
single<br />
double<br />
» x = int16(325);<br />
» x = 325.5;<br />
» int16(fix(x))<br />
ans =<br />
325<br />
» int16(325) * 4.39<br />
ans =<br />
1427<br />
» uint8('Danas je ...')<br />
ans =<br />
68 97 110 97 115 32 …<br />
106 101 32 46 46 46
Provera numeriĉkih tipova<br />
Komanda Opis<br />
whos x Ispisuje tip od x.<br />
xType = class(x); Tip od x dodeljuje promenljivoj xType.<br />
isnumeric(x) Da li je x numerik?<br />
isa(x, 'integer')<br />
isa(x, 'uint64')<br />
isa(x, 'float')<br />
isa(x, 'double')<br />
isa(x, 'single')<br />
Da li je x numerik određenog podtipa?<br />
isreal(x) Da li je x realan ili kompleksan?<br />
isnan(x) Da li x nije broj (Not a Number NaN) ?<br />
isinf(x) Da li je vrednosti x beskonačna?<br />
isfinite(x) Da li je vrednost x konačna?
• Vrednosti:<br />
– “Laž” = 0 (false)<br />
– “Istina” = 1 (true)<br />
vrednost razliĉita od nule<br />
(uobiĉajeno je 1)<br />
Logiĉki tip<br />
• Tipiĉno nastaje kao rezultat operacija<br />
poreĊenja<br />
• Važna primena u indeksiranju nizova<br />
» z = [true true false]<br />
z =<br />
1 1 0<br />
» A = [7 2 6 1 9];<br />
» k = A > 5<br />
k =<br />
1 0 1 0 1<br />
» b = A(k)<br />
b =<br />
7 6 9<br />
» b = A(A > 5)<br />
b =<br />
7 6 9<br />
» A(A > 5) = 0<br />
A =<br />
0 2 0 1 0
• Redosled<br />
– da li je promenljiva?<br />
– da li je ugraĊena funkcija?<br />
Parsiranje imena<br />
– da li je MEX, DLL ili M-datoteka u tekućem<br />
direktorijumu?<br />
– da li je MEX, DLL ili M-datoteka u nekom<br />
od MATLAB-ovih direktorijuma?<br />
– prijavljuje se greška.<br />
• imena MATLAB-ovih direktorijuma se dobijaju<br />
(ureĊuju) pomoću path funkcije<br />
• imena se mogu preklopiti<br />
» sin(1)<br />
ans =<br />
0.8415<br />
» sin=1<br />
sin =<br />
1<br />
» sin<br />
sin =<br />
1<br />
» sin(1)<br />
ans =<br />
1<br />
» clear sin<br />
» sin(1)<br />
ans =<br />
0.8415
Matriĉne operacije<br />
• Osnovne operacije:<br />
– sabiranje +<br />
– oduzimanje -<br />
– množenje *<br />
– delenje (levo) /<br />
X=B/A je rešenje sistema X*A=B<br />
– desno delenje \<br />
X=A\B je rešenje sistema A*X=B<br />
– stepenovanje ^<br />
– transponovanje ’<br />
• Operacije nad elementima matrice:<br />
– množenje .*<br />
– delenje (levo) ./<br />
– desno delenje .\<br />
– stepenovanje .^<br />
» r = A’*P + P*A - P*B*inv(R)*B’*P + Q;<br />
» a = [ 1 2; 3 4 ];<br />
» a * a'<br />
ans =<br />
5 11<br />
11 25<br />
» b = [ -1 2; 1 3 ];<br />
» a .* b<br />
ans =<br />
-1 4<br />
3 12<br />
» a * b<br />
ans =<br />
1 8<br />
1 18<br />
» b=a .\ 3<br />
b =<br />
3.0000 1.5000<br />
1.0000 0.7500
Rešavanje linearnog sistema jednaĉina<br />
• Sistem A·x=b ima rešenje x=A -1 ·b<br />
– u <strong>Matlab</strong>-u: x = A\b<br />
• Sistem x·A=b ima rešenje x=b/A<br />
– u <strong>Matlab</strong>-u: x = b/A<br />
• Primer:<br />
x<br />
1<br />
� x<br />
� 2x<br />
1<br />
� x<br />
1<br />
� 1<br />
�<br />
�<br />
�1<br />
��<br />
�1<br />
2<br />
� 3x<br />
� x<br />
2<br />
2<br />
3<br />
� x<br />
2<br />
�1<br />
�<br />
3<br />
� 2x<br />
x<br />
3<br />
�<br />
�2.<br />
5<br />
3<br />
�<br />
�<br />
1.<br />
5<br />
�1�<br />
�x<br />
2<br />
�<br />
�<br />
�<br />
� �<br />
x<br />
1 ��<br />
��<br />
x<br />
0.<br />
5<br />
1<br />
2<br />
3<br />
� �� 2.<br />
5�<br />
� � �<br />
�<br />
�<br />
�<br />
0.<br />
5<br />
�<br />
��<br />
��<br />
1.<br />
5 ��<br />
» A = [1 2 -1; -1 3 2; -1 -1 1];<br />
» b = [-2.5; 0.5; 1.5];<br />
» x = A\b<br />
x =<br />
2.5000<br />
-1.0000<br />
3.0000<br />
» A*x<br />
ans =<br />
-2.5000<br />
0.5000<br />
1.5000<br />
» x = inv(A)*b<br />
x =<br />
2.5000<br />
-1.0000<br />
3.0000
Rešavanje linearnog sistema jednaĉina (2)<br />
• Mogu re rešavati i preodreĊeni i<br />
neodreĊeni sistemi jednaĉina<br />
– Upotrebljava se metoda<br />
najmanjih kvadrata<br />
» A = [ 1 2 -1<br />
-1 3 2<br />
-1 -1 1<br />
1 2 3 ];<br />
» B = [ -2.5<br />
0.5<br />
1.5<br />
4 ];<br />
» x = A\B<br />
x =<br />
0.6238<br />
-0.7002<br />
1.5950<br />
» A*x<br />
ans =<br />
-2.3715<br />
0.4657<br />
1.6713<br />
4.0086
Matrice i funkcije<br />
• parametri i vraćene vrednosti funkcije su matrice<br />
• matematiĉka funkcija f koja ima parametar matricu X kao rezultat<br />
vraća matricu Y=f(X) sa elementima y ij = f(x ij)<br />
• elementarne matriĉne funkcije<br />
– determinanta matrice det(x)<br />
– inverzija inv(x)<br />
– pseudo-inverzija ne kvadratne matrice pinv(x)<br />
– formiranje karakteristiĉnog polinoma poly(x)<br />
– trag matrice trace(x)<br />
– ... (help matfun)<br />
• transcedentalne matriĉne funkcije<br />
– expm(x)<br />
– logm(x)<br />
– sqrtm(x)<br />
– ...
Operacije poreĊenja<br />
• operacije poreĊenja se primenjuju nad dve matrice jednakih dimenzija<br />
• rezultat operacije je matrica nula (“laž”) i jedinica (“istina”)<br />
• postoji šest relacionih operatora<br />
– manje <<br />
– manje ili jednako <br />
– veće ili jednako >=<br />
– jednako ==<br />
– nejednako ~=<br />
» 2 + 3 ~= 5<br />
ans =<br />
0<br />
» [ 1 2; 3 4 ] > [ 1 3; -3 5 ]<br />
ans =<br />
0 0<br />
1 0
Logiĉke operacije<br />
• logiĉke operacije se upotrebljvaju nad nizovima sa logiĉkim<br />
vrednostima<br />
• rezulati logiĉkih operacija su uvek matrice sa elementima 0 i 1<br />
• Logiĉke operacije su:<br />
– negacija (unarna operacija) ~<br />
– konjukcija (binarna operacija, logiĉko “i”) &<br />
– disjunkcija (binarna operacija, logiĉko “ili”) |<br />
» a = [0 0 1 1]; b = [0 1 0 1];<br />
» a & b<br />
ans =<br />
0 0 0 1<br />
» a | ~b<br />
ans =<br />
1 0 1 1
Logiĉke i funkcije poreĊenja<br />
• ove funkcije vraćaju logiĉku vrednost (ili više vrednosti)<br />
• funkcija any(x) vraća istinitu vrednost ako je barem jedan elemenat u x<br />
istinit (“radi po kolonama”)<br />
tipiĉna upotreba je: if any(x > 0.01)<br />
blok naredbi<br />
end<br />
• funkcija all(x) vraća istinitu vrednost ako su svi elemenati u x istiniti<br />
• funkcija find(x) vraća indekse elemenata sa “istinitom” vrednosti<br />
• provera “neregularnih vrednosti” u matrici<br />
– gde poseduje beskonaĉnosti isinf(x)<br />
– ...<br />
• provera tipa matrice (vraća skalar)<br />
– da li matrica postoji? exist(x)<br />
– da li je prazna? isempty(x)<br />
– da li je globalna promenljiva? isglobal(x)<br />
– ...
Generisanje vektora<br />
• Vektor sukcesivnih celobrojnih vrednosti iz itervala [a,b]<br />
x = a : b % “operator” “:”<br />
• Vektor vrednosti iz itervala [a,b] sa rastojanjem (korakom) c<br />
x = a : c : b<br />
» x = 1 : 6<br />
x =<br />
1 2 3 4 5 6<br />
» x = 2 : 3 : 13<br />
x =<br />
2 5 8 11<br />
» x = 2 : 0.2 : 3<br />
x =<br />
2.0000 2.2000 2.4000 2.6000 2.8000 3.0000<br />
» x = 2 : -1 : -2<br />
x =<br />
2 1 0 -1 -2
Selekcija elemenata matrice i vektora<br />
• indeksi elemenata su pozitivni, celi brojevi: 1, 2, ...<br />
• dimenzije<br />
– matrice [vrsta,kolona] = size(x)<br />
– vektora n = length(x)<br />
• selektovanje jednog elementa<br />
– matrice x(vrsta,kolona)<br />
– vektora x(n)<br />
• selektovanje submatrice (subvektora)<br />
– izdvajaju se elementi na preseku vrsta i kolona<br />
– vrste i kolone su odreĊene<br />
• pomoću indeks vektora<br />
• pomoću vektora logiĉkih vrednosti<br />
(za svaku npr. kolonu je zadata logiĉka<br />
vrednost i ako je ta vrednost “istina” kolona<br />
je selektovana)<br />
a =<br />
1 2 3<br />
4 5 6<br />
» n = size(a)<br />
n =<br />
2 3<br />
» [n,m] = size(a)<br />
n =<br />
2<br />
m =<br />
3
» a = [1 2 3; 4 5 6]<br />
a =<br />
1 2 3<br />
4 5 6<br />
» a(1,3)<br />
ans =<br />
3<br />
» a( : , [1 3] )<br />
ans =<br />
1 3<br />
4 6<br />
» a( : , : )<br />
a =<br />
1 2 3<br />
4 5 6<br />
Primeri selekcija elemenata<br />
» a( [false true], 2:3 )<br />
ans =<br />
5 6<br />
» a( : , 3:-1:1 )<br />
ans =<br />
3 2 1<br />
6 5 4<br />
» v = 3:-1:1<br />
v =<br />
3 2 1<br />
» a( : , v )<br />
ans =<br />
3 2 1<br />
6 5 4<br />
» a( [2 1] , v )<br />
ans =<br />
6 5 4<br />
3 2 1<br />
» x = -pi : 0.01 : pi;<br />
» y = sin(x);<br />
» y(y > 0.9999)'<br />
ans =<br />
0.9999<br />
1.0000<br />
1.0000<br />
» x(y > 0.9999)'<br />
ans =<br />
1.5584<br />
1.5684<br />
1.5784<br />
» find(y > 0.9999)<br />
ans =<br />
471 472 473
Brisanje i spajanje<br />
• Brisanje promenljivih i elemenata matrice<br />
– uklanjanje promenljivih iz radne memorije clear x y z<br />
– matrica može biti prazna x = [ ] (i tada postoji kao promenljiva)<br />
– brisanje celih kolona ili vrsta se vrši dodeljivanjem prazne matrice<br />
• Spajanje submatrica<br />
– spajanje po kolonama (matrice moraju imati jednak broj vrsta)<br />
– spajanje po vrstama (matrice moraju imati jednak broj kolona)<br />
» a = [ ]<br />
a =<br />
[ ]<br />
» b = [ 1 2 3 4 5 ]<br />
b =<br />
1 2 3 4 5<br />
» b(2:4) = [ ]<br />
b =<br />
1 5<br />
» b(4) = -1<br />
b =<br />
1 5 0 -1<br />
» b = [ 1 5 ];<br />
» b = [ b; 1+b ]<br />
b =<br />
1 5<br />
2 6<br />
» a = [ b b’ +<br />
a =<br />
1 5 1 2<br />
2 6 5 6<br />
» a = * b, b’ +;
Tekstualna promenljiva - string<br />
• predstavljena je vektorom vrstom od slova (ASCII znakova)<br />
• omogućava<br />
– formatizovanje ispisa i uĉitavanja vrednosti<br />
– prenošenje (i ureĊivanje) naredbi<br />
• postoji nekoliko grupa funkcija<br />
• spajanje stringova je kao spajanje vektora vrsta<br />
» a1 = 2; a2 = 3;<br />
» i = 1;<br />
» s = [ '5 * a' int2str(i) '^2’ +<br />
s =<br />
5 * a1^2<br />
» eval(s)<br />
ans =<br />
20
Matrice i vektori “poznatih” vrednosti<br />
• matrica nula zeros(n,m)<br />
• matrica jedinica ones(n,m)<br />
• jediniĉna matrica eye(n,m)<br />
• matrica elemenata po uniformnoj<br />
raspodeli rand(n,m)<br />
• matrica elemenata po normanoj<br />
raspodeli randn(n,m)<br />
• vektor ekvidistantnig vrednosti<br />
linspace(n,m,N)<br />
• vektor logaritamske<br />
baze logspace(n,m,N)<br />
• matrica za bazu 3D<br />
crtanja meshgrid(v1,v2)<br />
» a = zeros(2,3)<br />
a =<br />
0 0 0<br />
0 0 0<br />
» a( [2 3], [1 2] ) = 1<br />
a =<br />
0 0 0<br />
1 1 0<br />
1 1 0<br />
» a( [2 3], [1 2] ) = ones(2,2);<br />
» a = [ 1 2; 3 5 ]<br />
a =<br />
1 2<br />
3 5<br />
» abs(inv(a)*a - eye(2)) > 10*eps<br />
ans =<br />
0 0<br />
0 0
• dvodimenzioni niz == matrica<br />
Višedimenzioni nizovi<br />
– prvi indeks je redni broj vrste<br />
– drugi indeks je redni broj kolone<br />
• trodimenzioni niz<br />
Indeksi<br />
poĉinju<br />
od 1<br />
– treći indeks je redni broj strane
Pristup elementima nizova<br />
» A(2,3,2)<br />
ans =<br />
6<br />
» A(1,2,2)<br />
ans =<br />
8<br />
» A(:,2,1)<br />
ans =<br />
0<br />
-1<br />
2<br />
» A(:,:,2)<br />
ans =<br />
6 8 3<br />
4 3 6<br />
5 9 2<br />
» A(:,2,:)<br />
ans(:,:,1) =<br />
0<br />
-1<br />
2<br />
ans(:,:,2) =<br />
8<br />
3<br />
9<br />
» A([1 3],3,[2 1])<br />
ans(:,:,1) =<br />
3<br />
2<br />
ans(:,:,2) =<br />
3<br />
1
Formiranje višedimenzinonih nizova<br />
• na naĉin formiranja matrica, preko<br />
indeksa<br />
– broj elemenata u podnizovima<br />
se mora slagati<br />
• primer dodavanja nove<br />
dimenzije za A<br />
A je sada 3x3x3x2<br />
» A(:,:,1,2) = [1 2 3; 4 5 6; 7 8 9];<br />
» A(:,:,2,2) = [9 8 7; 6 5 4; 3 2 1];<br />
» A(:,:,3,2) = [1 0 1; 1 1 0; 0 1 1];<br />
» A=[1 0 3; 4 -1 2; 8 2 1];<br />
» A(:,:,2)=[6 8 3; 4 3 6; 5 9 2];<br />
» A(:,:,3) = 5<br />
A(:,:,1) =<br />
1 0 3<br />
4 -1 2<br />
8 2 1<br />
A(:,:,2) =<br />
6 8 3<br />
4 3 6<br />
5 9 2<br />
A(:,:,3) =<br />
5 5 5<br />
5 5 5<br />
5 5 5
Formiranje višedimenzinonih nizova (2)<br />
• upotrebom funkcija: ones, zeros,<br />
randn, ...<br />
• umnožavanjem repmat osnovne<br />
matrice<br />
• upotrebom cat funkcije<br />
B = cat(dim,<strong>A1</strong>,A2,...)<br />
– spaja listu nizova duž dimenzije<br />
dim<br />
– jediniĉne dimenzije se automatski<br />
umeću<br />
» B = cat(4,[2 8; 0 5],[1 3; 7 9])<br />
B(:,:,1,1) =<br />
2 8<br />
0 5<br />
B(:,:,1,2) =<br />
1 3<br />
7 9<br />
» B = randn(1,1,2)<br />
B(:,:,1) =<br />
-0.6918<br />
B(:,:,2) =<br />
0.8580<br />
» B = repmat([1 0],[3 4 2])<br />
B(:,:,1) =<br />
1 0 1 0 1 0 1 0<br />
1 0 1 0 1 0 1 0<br />
1 0 1 0 1 0 1 0<br />
B(:,:,2) =<br />
1 0 1 0 1 0 1 0<br />
1 0 1 0 1 0 1 0<br />
1 0 1 0 1 0 1 0
Informacije o višedimenzionim nizovima<br />
• broj elemenata po dimenzijama size<br />
• ukupan broj dimenzija ndims<br />
• spisak promenljivih sa dimenzijama i<br />
formatima whos<br />
» size(A)<br />
ans =<br />
3 3 3 2<br />
» ndims(A)<br />
ans =<br />
4<br />
» whos<br />
Name Size Bytes Class<br />
A 4-D 432 double array<br />
B 4-D 64 double array<br />
ans 1x1 8 double array<br />
Grand total is 63 elements using 504<br />
bytes
Rad sa dimenzijama matrice<br />
• redimenzionisanje matrice B = reshape(A,[s1 s2 s3 ...])<br />
(s1, s2, ... su nove dimenzije matrice B)<br />
• uklanjanje jediniĉnih dimenzija C = squeeze(B)<br />
• permutovanje dimenzija “prepakuje niz”<br />
B = permute(A,dims)<br />
– generalizacija transponovanja
Raĉunanje nad višedimenzionim nizovima<br />
• funkcije koje rade nad vektorima,<br />
npr. sum, mean, ...<br />
– obiĉno rade po prvoj nejjediniĉnoj<br />
dimenziji niza<br />
• funkcije koje rade elemenat po<br />
elemenat, npr. sin, ...<br />
• funkcije koje rade sa matricama<br />
– ne prihvataju višedimenzione<br />
nizove kao argumente<br />
» ndims(A)<br />
ans =<br />
4<br />
» eig(A)<br />
??? Error using ==> eig<br />
Input arguments must be 2-D.<br />
» eig(A(:,:,1,1))<br />
ans =<br />
6.4897<br />
-3.6978<br />
-1.7919
Blok naredbi<br />
• blok naredbi saĉinjava nekoliko MATLAB iskaza (komandi)<br />
razdvojenih separatorom “;” ili “,”<br />
– separator “;” spreĉava ispis vrednosti dodeljenih promenljivima iz<br />
naredbe<br />
• naredbe se mogu navoditi u jednoj liniji ili u nekoliko linija<br />
• kada je potrebno jednu naredbu nastaviti u narednoj liniji, predhodna<br />
linija se završava “...”<br />
» a = [ 1 2 3<br />
4 5 6 ]<br />
a =<br />
1 2 3<br />
4 5 6<br />
» b = [ 1 2 3 ...<br />
4 5 6 ]<br />
b =<br />
1 2 3 4 5 6
• uslovni skok if-else i switch<br />
• programske petlje<br />
– prebrojiva petlja for<br />
Kontrola toka programa<br />
– neprebrojiva petlja sa ispitivanjem uslova na poĉetku while<br />
– nasilni izlazak iz petlje break<br />
• nasilni povratak iz funkcije return<br />
• nasilni povratak iz funkcije po otkrivanju greške i njen ispis error<br />
• ne postoji bezuslovni skok
FOR petlja<br />
• FOR je prebrojiva petlja, tj. unapred se zna broj prolaza kroz blok<br />
naredbi<br />
• oblik:<br />
for promenljiva = izraz<br />
blok naredbi<br />
end<br />
• rezultat izraĉunavanja izraz-a je matrica, a promenljiva prima vrednosti<br />
od prve do poslednje kolone rezultata<br />
• uobiĉajeno upotreba je npr. for i=1:n, ...<br />
• petlja se nasilno napušta sa break<br />
• mogu se upotrebljavati ugnježdene petlje<br />
» for i = 1:5<br />
for j = 1:4<br />
a(i,j) = 1 / (i+j-1);<br />
end<br />
end
WHILE petlja<br />
• petlja se izvršava sve dok je neki uslov ispunjen i u principu se ne zna<br />
broj prolazaka kroz petlju do prestanka važenja uslova<br />
• uslov se proverava na poĉetku petlje<br />
• oblik:<br />
while uslov<br />
blok naredbi<br />
end<br />
• uslov je skalar sa logiĉkom vrednosti<br />
• petlja se nasilno napušta sa break<br />
• mogu se upotrebljavati ugnježdene petlje<br />
» s = 0; n = 1;<br />
» while 1 / n^2 > 1e-4<br />
s = s + (-1)^n / n^2;<br />
n = n+1;<br />
end<br />
» s<br />
s = -0.8225<br />
» f = [1 1]; i = 1; % Fibonacci-jevi brojevi<br />
» while f(i) + f(i+1) < 1000<br />
f(i+2) = f(i) + f(i+1);<br />
i = i + 1;<br />
end<br />
» f<br />
f =<br />
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Uslovno grananje programa<br />
• opšti oblik:<br />
if uslov 1<br />
blok naredbi 1<br />
elseif uslov 2<br />
blok naredbi 2<br />
elseif uslov 3<br />
...<br />
else<br />
blok naredbi n<br />
end<br />
• uslov je skalar sa logiĉkom vrednosti<br />
• tipiĉne upotrebe:<br />
ili<br />
if uslov<br />
blok naredbi<br />
end<br />
if uslov<br />
blok naredbi 1<br />
else<br />
blok naredbi 2<br />
end<br />
“3n+1” problem iz teorije<br />
brojeva. Da li postoji<br />
prirodan broj za koji se<br />
unutrašnja petlja ne<br />
završava?<br />
» while 1<br />
n = input('Unesi n:');<br />
if n 1<br />
if rem(n,2) == 0<br />
n = n / 2<br />
else<br />
n = 3*n+1<br />
end<br />
end<br />
end
Kontrola toka programa - switch, case<br />
• switch komanda izvršava blok komandi u<br />
zavisnosti od vrednosti promenljive uslova.<br />
• case oznaĉava i razdvaja blokove komandi<br />
• samo prvo poklapanje sa case se ivršava<br />
• swich se završava end-om<br />
• “switch ne propada”, nakon završene poslednje<br />
komande case bloka, program nastavlja ispod<br />
end-a.<br />
(break izraz iz C-a ne postoji)<br />
switch izraz<br />
case 0<br />
blok 1<br />
case 1<br />
blok 2<br />
case 2<br />
...<br />
otherwise<br />
blok<br />
end
Kontrola toka programa - izuzeci<br />
• Podržan je rad sa izuzecima<br />
try<br />
a = [1 2];<br />
b = a * [1 4];<br />
catch<br />
e = lasterror<br />
…<br />
end<br />
• Lasterror je funkcija koja vraća opis greške<br />
e =<br />
message: [1x58 char]<br />
identifier: 'MATLAB:innerdim'<br />
stack: [1x1 struct]
Nizovi ćelija i struktura<br />
• su posebne klase MATLAB nizova<br />
• Ćelija<br />
– sadrži ćelije (binarne podatke) koji su sami po sebi nizovi<br />
– omogućava smeštanje<br />
• Struktura<br />
• razliĉitih tipova podataka u niz i<br />
• podataka razliĉitih dimenzija<br />
– takoĊe udružuje podatake (razliĉitih tipova)<br />
– za razliku od ćelija struktura sadrže polja kojima se može pristupati<br />
preko imena
• sastoji se od imenovanih polja<br />
• svako polje može sadržati<br />
proizvoljan tip podataka<br />
• formiranje<br />
– dodelom vrednosti<br />
– upotrebom struct funkcija<br />
Struktura<br />
» patient<br />
patient =<br />
name: 'John Doe'<br />
billing: 127<br />
test: [3x3 double]
Formiranje strukure dodelom vrednosti<br />
» patient.name = 'John Doe';<br />
» patient.billing = 127.00;<br />
» patient.test = [79 75 73; 180 178 177.5; 220 210 205];<br />
» patient(2).name = 'Ann Lane';<br />
» patient(2).billing = 28.50;<br />
» patient(2).test = [68 70 68; 118 118 119; 172 170 169];<br />
» patient<br />
patient =<br />
1x2 struct array with fields:<br />
name<br />
billing<br />
test<br />
» patient(2).test<br />
ans =<br />
68 70 68<br />
118 118 119<br />
172 170 169
Višedimenzioni nizovi struktura<br />
patient(1,1,1).name = 'John Doe'; patient(1,1,1).billing = 127.00;<br />
patient(1,1,1).test = [79 75 73; 180 178 177.5; 220 210 205];<br />
patient(1,2,1).name = 'Ann Lane'; patient(1,2,1).billing = 28.50;<br />
patient(1,2,1).test = [68 70 68; 118 118 119; 172 170 169];<br />
patient(1,1,2).name = 'Al Smith'; patient(1,1,2).billing = 504.70;<br />
patient(1,1,2).test = [80 80 80; 153 153 154; 181 190 182];<br />
patient(1,2,2).name = 'Dora Jones'; patient(1,2,2).billing = 1173.90;<br />
patient(1,2,2).test = [73 73 75; 103 103 102; 201 198 200];
Formiranje strukture upotrebom struct<br />
• str_array = struct('field1','val1','field2','val2', ...)<br />
» patient = struct( 'name', 'John Doe’, ...<br />
’billing’, 127.00, ...<br />
‘test’, [79 75 73; 180 178 177.5; 220 210 205] );
Pristup podacima u nizu struktura<br />
• može se pristupiti jednoj strukturi<br />
• polju u okviru odreĊene strukture<br />
• nekim vrednostim iz polja<br />
• ne može se formirati nov niz na osnovu izbora polja strukture<br />
» p.name<br />
ans =<br />
John Doe<br />
ans =<br />
Ann Lane<br />
ans =<br />
Ja<br />
» p(3)<br />
ans =<br />
name: 'Ja'<br />
billing: 0<br />
test: [2x2 double]<br />
» p(2).billing<br />
ans =<br />
28.5000<br />
» p(2).test([1 3],2)<br />
ans =<br />
70<br />
170<br />
» y=p.name<br />
??? Illegal right hand side in<br />
assignment. Too many elements.<br />
» [p.billing]<br />
ans =<br />
127.0000 28.5000 0
Polje strukture<br />
• ĉitanje vrednosti polja<br />
f = getfield( array, {array_index}, 'field', {field_index} )<br />
• postavljanje vrednosti polja<br />
f = setfield( array, {array_index}, 'field', {field_index}, value )<br />
• dodavanje polja<br />
patient(2).ssn = '000–00–0000';<br />
• brisanje polja<br />
struc2 = rmfield( array, 'field name‘ )
Organizovanje podataka u nizove struktura<br />
• naĉin organizacije je bitan radi kasnijeg pristupa podskupo podataka<br />
• Primer: posmatra se bit-mapirana slika dimenzije 128x128 sa 3 matrice<br />
boja RED, GREEN i BLUE.<br />
– grupisanje podataka po bojama<br />
– grupisanje podataka po pixel-ima<br />
A.r = RED;<br />
A.g = GREEN;<br />
A.b = BLUE;<br />
for i = 1:size(RED,1)<br />
for j = 1:size(RED,2)<br />
B(i,j).r = RED(i,j);<br />
B(i,j).g = GREEN(i,j);<br />
B(i,j).b = BLUE(i,j);<br />
end<br />
end
A(1).data = [3 4 7; 8 0 1];<br />
A(1).nest.testnum = 'Test 1';<br />
A(1).nest.xdata = [4 2 8];<br />
A(1).nest.ydata = [7 1 6];<br />
Ugnježdene strukture<br />
A(2).data = [9 3 2; 7 6 5];<br />
A(2).nest.testnum = 'Test 2';<br />
A(2).nest.xdata = [3 4 2];<br />
A(2).nest.ydata = [5 0 9];
Niz ćelija<br />
• je niz ĉiji su elementi ćelije, tj. to je kontejner MATLAB-ovih nizova<br />
• npr., jedna ćelija može sadržati matricu, druga string, treća vektor<br />
kompleksnih brojeva, itd.
Višedimenzioni nizovi ćelija - cells<br />
• sliĉno brojevima, višedimenzini nizovi ćelija su generalizacija matrice<br />
ćelija<br />
» A{1,1} = [1 2;4 5];<br />
» A{1,2} = 'Name';<br />
» A{2,1} = 2 - 4i;<br />
» A{2,2} = 7;<br />
» B{1,1} = 'Name2';<br />
» B{1,2} = 3;<br />
» B{2,1} = 0:1:3;<br />
» B{2,2} = [4 5]';<br />
» C = cat(3,A,B);
Formiranje niza ćelija dodelom vrednosti<br />
• niz ćelija se formira popunjavanjem ćelija po ćelija<br />
• dva ravnopravna naĉina<br />
– indeksiranje ćelije<br />
– indeksiranje sadržaja<br />
A(1,1) = { [1 4 3; 0 5 8; 7 2 9] };<br />
A(1,2) = { 'Anne Smith‘ };<br />
A(2,1) = { 3+7i };<br />
A(2,2) = { –pi:pi/10:pi };<br />
A{1,1} = [1 4 3; 0 5 8; 7 2 9];<br />
A{1,2} = 'Anne Smith';<br />
A{2,1} = 3+7i;<br />
A{2,2} = –pi:pi/10:pi;<br />
– {} је konstruktor niza ćelija (poput [] za matrice)<br />
– {} se takoĊe upotrebljavaju za spajanje ćelija<br />
– prealokacija mem. prostora za ćelije X=cell(3,9)
Pristup podacima u nizu ćelija<br />
• indeksiranje sadržaja daje pristup podacima<br />
• indeksiranje ćelija se upotrebljava za dodelu niza ćelija drugoj<br />
promenljivoj<br />
• pojedine ćelije se mogu brisati<br />
» x = { [1 1], [2 2], [3 3], [4 4] };<br />
» x(2)<br />
ans = [1x2 double]<br />
» x(1:2)<br />
ans = [1x2 double] [1x2 double]<br />
» x{1:2}<br />
ans = 1 1<br />
ans = 2 2<br />
» x(3)=[]<br />
x = [1x2 double] [1x2 double] [1x2 double]<br />
» x{3}=[]<br />
x = [1x2 double] [1x2 double] []
Zamena liste promenljivih nizom ćelija<br />
• kod liste ulaznih i izlaznih<br />
parametara funkcije<br />
• kod prikaza na displeju<br />
• kod formiranja nizova<br />
» C(1) = { [1 2 3] }; ...<br />
C(2) = { [1 0 1] };<br />
» conv( C{1:2} )<br />
ans =<br />
1 2 4 2 3<br />
» [C{1:2}]<br />
ans =<br />
1 2 3 1 0 1<br />
» [ E{1:2} ] = eig( [-1 2;0 -2] )<br />
E =<br />
[2x2 double] [2x2 double]<br />
» E{1:2}<br />
ans =<br />
1.0000 -0.8944<br />
0 0.4472<br />
ans =<br />
-1 0<br />
0 -2
Ugnježdeni nizovi ćelija<br />
» clear A<br />
» A(1,1) = { magic(5) };<br />
» A(1,2) = { { [5 2 8; 7 3 0; 6 7 3] 'Test 1'; [2-4i 5+7i] { 17 [] } } }<br />
A =<br />
[5x5 double] {2x2 cell}<br />
» A(2)<br />
ans =<br />
{2x2 cell}<br />
» A{2}<br />
ans =<br />
[3x3 double] 'Test 1'<br />
[1x2 double] {1x2 cell}<br />
» A{2}{1,1}<br />
ans = 5 2 8<br />
7 3 0<br />
6 7 3<br />
» A{2}{1,1}(1,3)<br />
ans = 8
Niz ćelija popunjenih strukturama<br />
» c_str = cell(1,2)<br />
» c_str{1}.label = '12/2/94 - 12/5/94';<br />
» c_str{1}.obs = [47 52 55 48; 17 22 35 11];<br />
» c_str{2}.xdata = [-0.03 0.41 1.98 2.12 17.11];<br />
» c_str{2}.ydata = [-3 5 18 0 9];<br />
» c_str{2}.zdata = [0.6 0.8 1 2.2 3.4];<br />
» c_str{1:2}<br />
ans =<br />
label: '12/2/94 - 12/5/94'<br />
obs: [2x4 double]<br />
ans =<br />
xdata: [-0.0300 0.4100 1.9800 2.1200 17.1100]<br />
ydata: [-3 5 18 0 9]<br />
zdata: [0.6000 0.8000 1 2.2000 3.4000]<br />
» c_str{2}.zdata(4)<br />
ans =<br />
2.2000
Polinomi<br />
• polinomi se predstavljaju vektor vrstom ĉiji su elementi koeficijenti<br />
polinoma po opadajućem stepenu<br />
npr., polinomu Q(s) = 2s 3 + 4.1s 2 - 12<br />
odgovara vektor Q = [ 2 4.1 0 -12 ]<br />
• funkcije za rad sa polinomima:<br />
– conv množenje polinoma<br />
– deconv delenje polinoma<br />
– poly karakteristiĉni polinom<br />
– polyder diferenciranje polinoma<br />
– polyfit daje polinom koji aproksimira zadate podatke<br />
– polyval izraĉunavanje vrednosti polinoma<br />
– polyvalm sraĉunavanje vrednosti matriĉnog polinoma<br />
– residue razvoj na parcijalne sabirke (reziduale)<br />
– roots daje nule polinoma
» P = [2 1.1]; Q1 = [1 3 2]; Q2 = [1 2 3];<br />
» Q = conv( Q1, Q2 )<br />
Q = 1 5 11 13 6<br />
» [r,p,k] = residue( P, Q )<br />
r =<br />
0.9667<br />
-0.2583 - 0.3418i<br />
-0.2583 + 0.3418i<br />
-0.4500<br />
p =<br />
-2.0000<br />
0.<br />
9667<br />
� �<br />
s � 2<br />
-1.0000 + 1.4142i<br />
-1.0000 - 1.4142i<br />
-1.0000<br />
k =<br />
[ ]<br />
» [pp,qq] = residue( r(2:3), p(2:3), k )<br />
pp =<br />
-0.5167 0.4500<br />
qq =<br />
1.0000 2.0000 3.0000<br />
Primer upotrebe polinoma<br />
�<br />
0.<br />
2583<br />
�<br />
s � 1 �<br />
0.<br />
3418j<br />
2j<br />
�<br />
W(<br />
s)<br />
�<br />
( s<br />
2<br />
�<br />
3s<br />
2s<br />
2)(<br />
s<br />
1.<br />
1<br />
2s<br />
� 1.<br />
1<br />
� 4 3<br />
2<br />
s � 5s<br />
� 11s<br />
� 13s<br />
� 6<br />
� 0.<br />
2583�<br />
0.<br />
3418j<br />
� 0.<br />
45<br />
� � 0<br />
s � 1 � 2j<br />
s � 1<br />
0.<br />
9667 � 0.<br />
45<br />
� � �<br />
s � 2 s � 1<br />
�<br />
�<br />
�<br />
2<br />
�<br />
0.<br />
5167s<br />
2<br />
s � 2s<br />
2s<br />
�<br />
3)<br />
� 0.<br />
45<br />
� 3
M - skript-datoteke i funkcije<br />
• omogućavaju izvršavanje ranije pisanog koda; olakšavaju ispravljanje<br />
grešaka i dorade, a time olakšavaju programiranje<br />
• M - skript-datoteke su ASCII datoteke sa blokom naredbi<br />
– ime datoteke se završava sa “.m”<br />
– pozivaju se imenom datoteke (bez “.m”)<br />
– nemaju parametre<br />
– vrednosti promenljivih preuzimaju i ostavljaju u radnom okruženju<br />
• M - funkcije su skript-datoteke odreĊenog formata zaglavlja:<br />
jedna<br />
datoteka<br />
ime.m<br />
function [ ip1, ip2, ... ipn ] = ime ( up1, up2, ... upm )<br />
blok naredbi (negde u bloku izlazni parametri primaju vrednosti)<br />
– imaju ulazne: up1,up2,...upm i izlazne parametre: ip1,ip2,...ipn<br />
– kod poziva funkcije se ne moraju navoditi svi parametri; broj<br />
upotrebljenih ulaznih parametara je nargin, a izlaznih nargout<br />
– sve promenljive koje definišu su lokalne<br />
– uobiĉajeno je da ime funkcije bude jednako imenu datoteke “.m”
Persistent<br />
• Deklariše perzistentne promenljive u funkcijama<br />
– Vidljive su samo u funkciji koja ih deklariše<br />
persistent X Y Z<br />
• Vrednost promenljivih se oĉuvava izmeĊu poziva funkcije
Primer M-funkcije<br />
function [ status, sv ] = stabilan( X, stepen )<br />
% STABILAN - ispituje stabilnost sistema na osnovu imenioca funkcije<br />
% prenosa ili na osnovu matrice sistema u prostoru stanja<br />
% Ulaz:<br />
% X - polinom ili matrica sistema<br />
% stepen - je zadati stepen stabilnosti<br />
% Izlaz:<br />
% status - =1 ako je sistem stabilan, inace =0<br />
% sv - sopstvene vrednosti ili koreni karakteristicne jednacine<br />
% A. Erdeljan, 14.4.98<br />
if nargin == 1, stepen = 0; end % podrazumevana vrednost<br />
if min(size(X)) == 1 % karak. polinom<br />
sv = roots(X);<br />
else % matrica sistema<br />
sv = eig(X);<br />
end<br />
status = all(sv < stepen);
Pimer (nastavak)...<br />
• komentar iza zaglavlja funkcije se ispisuje naredbom<br />
help stabilan<br />
• Primeri upotrebe:<br />
» Q = [1 3 2];<br />
» stabilan(Q)<br />
ans =<br />
1<br />
» [s,v] = stabilan(Q)<br />
s =<br />
1<br />
v =<br />
-2<br />
-1<br />
» [s,v] = stabilan(Q,-1)<br />
s =<br />
0<br />
v =<br />
-2<br />
-1<br />
» [s,v] = stabilan( [0 1; 0 -3], eps )<br />
s =<br />
1<br />
v =<br />
0<br />
-3
• Je promenljiva koja se koristi za<br />
indirektno pozivanje funkcije<br />
Handle funkcije<br />
– Postojeće funkcije (ukljuĉujući<br />
spoljašnje f-je)<br />
– Anonimne funkcije (upravo<br />
kreirane)<br />
» s = @sin;<br />
» s(pi/4)<br />
ans =<br />
0.7071<br />
» parabola = @(x) x.^2+3*x+4<br />
parabola =<br />
@(x) x.^2+3*x+4<br />
» parabola(-1)<br />
ans =<br />
2<br />
» parabola([0 1 2])<br />
ans =<br />
4 8 14<br />
» f = @(x, a) a*x+4;<br />
» f(2,3)<br />
ans =<br />
10
Funkcije funkcija<br />
• imaju M-funkciju (handl f-je) kao argument @funkcija<br />
• su nelinearne numeriĉke metode za:<br />
– analizu i crtanje funkcija<br />
• fminbnd - traženje minimuma f-je jedne promenljive<br />
• fminsearch - traženje minimuma f-je više promenljivih<br />
• fzero - nule funkcije jedne promenljive<br />
– crtanje funkcija<br />
• fplot - crtanje funkcije, …<br />
– rešavanje sistema diferencijalnih jednaĉina<br />
• ode23 - Runge-Kutta matod 2-3 reda<br />
• ode45 -Runge-Kutta-Fehlberg matod 4-5 reda<br />
• …<br />
– numeriĉko rešavanje integrala (quadrature)<br />
• quad - Simson-ovo pravilo, …
Rešavanje diferencijalnih jednaĉina pomoću ode23 ili ode45<br />
• može se rešiti obiĉna diferencijalna jednaĉina višeg reda<br />
• treba napraviti sistem diferencijalnih jednaĉina 1. reda i zapisati ga u<br />
zasebnu M-funkciju (sistem jednaĉina može biti nelinearan)<br />
zaglavlje funkcije mora biti oblika: function xprim = ime( t, x )<br />
gde je t vreme, a x vektor promenljivih stanja<br />
postoji problem sa prenošenjem parametara u ovakvu M-funkciju<br />
• poziv metode: [ t, x ] = ode23( @ime, [tp, tk], x0 )<br />
ili [ t, x ] = ode45( @ime, [tp, tk], x0 )<br />
Ulazni parametri: ime - ime M-funkcije koja opisuje sistem jednaĉina,<br />
tp - poĉetni trenutak integracije, tk - krajnji trenutak, x0 - vektor<br />
poĉetnih vrednosti promenljivih stanja.<br />
Izlazni parametri: t - vektor vremenskih trenutaka u kojima su<br />
izraĉunata rešenja, a x - matrica kretanja promenljivih stanja poreĊanih<br />
po kolonama. Prva vrsta odgovara x0 i poĉetnom trenutku tp, dok je u<br />
poslednjoj vrsti krajnja vrednost prom. stanja (u tk).<br />
• ode metode imaju promenljivi (adaptivni) korak integracije, tako da<br />
dobijena rešenja nisu ekvidistantna
Van der Pol - ova jednaĉina:<br />
�x<br />
��<br />
( x<br />
x<br />
x�<br />
x�<br />
1<br />
1<br />
2<br />
�<br />
�<br />
�<br />
2<br />
x�<br />
,<br />
�x<br />
x<br />
1<br />
�1)<br />
x�<br />
�<br />
1<br />
x<br />
2<br />
( x<br />
�<br />
2<br />
2<br />
x<br />
x<br />
�1)<br />
�<br />
Primer upotrebe ode23<br />
�<br />
x<br />
0<br />
2<br />
function xprim = vdpol( t, x )<br />
% Opis Van der Pol-ove dif. jednacine<br />
xprim = [ x(1) * (1-x(2)^2) - x(2)<br />
x(1) ];<br />
» tp = 0; tk = 20; x0 = [ 0 0.25 ];<br />
» [ t, x ] = ode23( @vdpol, [tp tk], x0 );<br />
» plot( t, x )<br />
Napomena: Brojevi “23”, odnosno “45” u imenu funkcija ode23 i ode45 se odnose<br />
na stepene Taylor-ovih redova upotrebljanih u odgovarajućim algoritmima, a<br />
ne odnose se na red diferencijalne jednaĉine koja se rešava. U principu, metod<br />
ode45 je namenjen rešavanju diferencijalnih jednaĉina visokog reda.
Primer funkcije: Metoda Runge-Kutta 4. reda<br />
function [t, x] = rkutta4( F, tp, tf, x0, T )<br />
% Metod integracije RUNGE-KUTTA 4. reda<br />
% parametri su isti kao kod ode23,<br />
% sem T koje predstavlja korak integracije<br />
if nargin < 5, T = 0.1; end<br />
t = tp : T : tf;<br />
n = length(t);<br />
x = zeros( n, length(x0) );<br />
x(1,:) = x0(:)';<br />
tl = tp;<br />
for i = 1 : n-1<br />
tl = tl + T;<br />
xp = x(i,:)';<br />
k1 = T * feval( F, tl, xp );<br />
k2 = T * feval( F, tl+0.5*T, xp+0.5*k1 );<br />
k3 = T * feval( F, tl+0.5*T ,xp+0.5*k2 );<br />
k4 = T * feval( F, tl+T, xp+k3 );<br />
x(i+1,:) = x(i,:) + (k1/6 + k2/3 + k3/3 + k4/6)';<br />
end
Globalne promenljive<br />
• uvedene su da bi im se pristupalo iz M-funkcija<br />
• rešavaju problem parametrizovanja sistema dif. jednaĉina koje se<br />
rešavaju pomoću ode metoda<br />
x�<br />
x�<br />
1<br />
2<br />
�<br />
x<br />
1<br />
� �x<br />
��x<br />
2<br />
1<br />
x<br />
2<br />
� �x<br />
1<br />
x<br />
2<br />
function xp = lotka( t, x )<br />
% Lotka-Volterra model<br />
global ALPHA BETA<br />
xp = [ x(1) - ALPHA*x(1)*x(2)<br />
-x(2) + BETA*x(1)*x(2) ];<br />
» global ALPHA BETA<br />
» ALPHA = 0.01;<br />
» BETA = 0.02;<br />
» [ t, x ] = ode23( @lotka',[ 0 10], [1 1] );
Primer upotrebe ode23/ode45 – model sa parametrima �<br />
• ode23/ode45 omogućava<br />
zadavanje parametara<br />
modela<br />
x�<br />
x�<br />
1<br />
2<br />
�<br />
x<br />
1<br />
� �x<br />
��x<br />
2<br />
1<br />
x<br />
2<br />
� �x<br />
1<br />
x<br />
2<br />
1000<br />
function xp = lotka7( t, x, alpha, beta )<br />
% Lotka-Volterra model<br />
xp = [ x(1) - alpha*x(1)*x(2)<br />
-x(2) + beta*x(1)*x(2) ];<br />
0<br />
0 5 10 15 20<br />
» al = 0.01;<br />
» be = 0.02;<br />
» [ t, x ] = ode45( @lotka7, [0, 10], [1; 1], [ ], al, be );<br />
» plot( t, x, ‘.-’ )<br />
800<br />
600<br />
400<br />
200
Klase i objekti<br />
• klase su novi tipovi podataka koje korisnik uvodi<br />
• objekti su primerci tih klasa (instance)<br />
• klasa definiše strukturu podataka i vrste operacija i funkcija koje se<br />
mogu primeniti nad tim podacima (metode klase)<br />
• ugraĊene klase su: double, sparse, char, struct, cell, …<br />
• toolbox-ovi definišu dodatne klase<br />
• Primer:<br />
Formiranje objekta tipa polinoma p(x) = x 3 – 2x – 5, na osnovu vektora<br />
koeficijenata polinoma:<br />
p = polynom([1 0 -2 -5])
• Mesto opisa klase<br />
Naĉini opisa klase<br />
– Opis cele klase u jednoj .m datoteci (v7.6) neka_klasa.m<br />
– Opis metoda klase u posebnim .m datotekama u njima<br />
zajedniĉkom direktorijumu @neka_klasa<br />
(privatne metode su u private poddirektorijumu)<br />
• Klase se mogu grupisati u pakete<br />
– Paket je direktorijum naziva +neki_paket<br />
– Sadrži opise klasa<br />
– Klasa paketa se identifikuje neki_paket.neka_klasa
• Delovi opisa klase (blokovi)<br />
– Definicija klase classdef<br />
Opis klase<br />
– Atributi properties<br />
– Metode methods<br />
– DogaĊaji events<br />
classdef polynom<br />
% opis klase<br />
properties<br />
coef<br />
end<br />
methods<br />
function obj = polynom(a)<br />
% konstruktor<br />
...<br />
end<br />
function obj = set.coef(obj, val)<br />
...<br />
end<br />
... % ostale metode<br />
end<br />
end
Konstruktor<br />
• Konstruktor se uvek izvršava kod formiranja novog objekta<br />
• U starijim verzijama (pre v7.6) postavljao se tip<br />
obj = class(p,'polynom');<br />
function obj = polynom(a)<br />
%POLYNOM Polynomial class constructor.<br />
% p = POLYNOM(v) creates a polynomial object from the vector v,<br />
% containing the coefficients of descending powers of x.<br />
if isa(a,'polynom')<br />
obj.coef = a.coef;<br />
else<br />
obj.coef = a(:).';<br />
end<br />
end
Konverzije tipova<br />
• zahteva postojanje metode sa imenom klase u koju se dozvoljava<br />
konverzija<br />
• najĉešće upotrebljavane su konverzije u tipove double i char<br />
• display (ili disp) je metoda koja se poziva kod dodele vrednosti<br />
promenljivoj (a MATLAB izraz se ne završava sa “;”)<br />
function c = double(p)<br />
% POLYNOM/DOUBLE Convert polynom object to coefficient vector.<br />
% c = DOUBLE(p) coverts a polynomial object to the vector c<br />
% containing the coefficients of descending powers of x.<br />
c = p.coef;<br />
end<br />
» double(p)<br />
ans =<br />
1 0 -2 -5
Definisanje metoda klase<br />
• methods polynom - daje spisak motoda klase “polynom”<br />
• Konstruktor je metod istog imena kao i klasa<br />
• Destruktor je delete metod<br />
function q = diff(p)<br />
% POLYNOM/DIFF DIFF(p) is the derivative of the polynom p.<br />
c = p.coef;<br />
d = length(c) – 1; % degree<br />
q = polynom(p.c(1:d).*(d:–1:1));<br />
end
Preopterećenje operatora<br />
• svi ugraĊeni aritmetiĉki operatori imaju svoje funkcije<br />
function r = plus(p,q)<br />
% POLYNOM/PLUS Implement p + q for polynoms.<br />
p = polynom(p); q = polynom(q);<br />
k = length(q.coef) – length(p.coef);<br />
r = polynom([zeros(1,k) p.coef] + [zeros(1,–k) q.coef]);<br />
end<br />
» q = p + 1<br />
q =<br />
x^3 – 2*x – 4<br />
» r = p*q<br />
r =<br />
x^6 – 4*x^4 – 9*x^3 + 4*x^2 + 18*x + 20<br />
• mogu se preopteretiti:<br />
aritmetiĉki, logiĉki, relacioni operatori, ”:”, transponovanje, ispis na<br />
displej, spajanje vrsta i kolona [], indeksiranje.
Prioritet metoda objekta<br />
• kod izraĉunavanja izraza a+b ili b+a poziva se metoda plus levog<br />
operanda<br />
• ukoliko je plus metod desnog operanda višeg prioriteta, tada će on biti<br />
izvršen<br />
• funkcije koje postavljaju objekat na željeno mesto u hijerarhiji<br />
objekata su:<br />
– superiorto(‘naziv_druge_klase’) i<br />
– inferiorto(‘naziv_druge_klase’)<br />
One se pozivaju u konstruktoru objekta.
Primer - polynom<br />
» a = polynom([1 2 3])<br />
a =<br />
x^2 + 2*x + 3<br />
» r = roots(a)<br />
r =<br />
-1.0000 + 1.4142i<br />
-1.0000 - 1.4142i<br />
» y = a(0:0.5:2) % y = polyval(a, 0:0.5:2)<br />
y =<br />
3.0000 4.2500 6.0000 8.2500 11.0000<br />
» b = polynom([2 1])<br />
b =<br />
2*x + 1<br />
» c = a*b + 2*b - 4<br />
c =<br />
2*x^3 + 5*x^2 + 12*x + 1<br />
» d = diff(c)<br />
d =<br />
6*x^2 + 10*x + 12<br />
» plot(c) -50<br />
-4 -2 0 2 4<br />
150<br />
100<br />
50<br />
0<br />
2*x 3 + 5*x 2 + 12*x + 1
» b = [2 1];<br />
» c = a*b + 2*b - 4<br />
c =<br />
2*x^3 + 5*x^2 + 12*x + 1<br />
» d = c.diff<br />
d =<br />
6*x^2 + 10*x + 12<br />
» c.plot<br />
» c<br />
c =<br />
2*x^3 + 5*x^2 + 12*x + 1<br />
» p = double(c)<br />
p =<br />
2 5 12 1<br />
» p(2)<br />
ans =<br />
5<br />
» c(2)<br />
c =<br />
Još primera - polynom<br />
61 -50<br />
-4 -2 0 2 4<br />
150<br />
100<br />
50<br />
0<br />
2*x 3 + 5*x 2 + 12*x + 1
NasleĊivanje<br />
• kljuĉna osobina ponovne upotrebe koda u OOP<br />
• kada se objekat potomak izvede iz objekta roditelja, tada on nasledi<br />
sva polja strukture roditelja i može da izvršava njegove metode<br />
• objekat roditelja može izvršavati metode potomka koje je on nasledio,<br />
dok ne može izvršavati novouvedene metode<br />
• Tipovi nasleĊivanja<br />
– jednostruko - potomak nasleĊuje osobine samo jednog roditelja<br />
– višestruko - potomak nasleĊuje osobine više roditelja<br />
• nasleĊivanje se može protezati kroz nekoliko generacija
Jednostruko nasleĊivanje<br />
• klasa nasleĊuje atribute neke druge<br />
klase (roditeljske) i obiĉno dodaje<br />
nove atribute (podatke i metode)<br />
• objekat potomka sadrži ista polja<br />
kao i roditeljska klasa i obiĉno još<br />
neka<br />
• konstruktor klase potomka treba da<br />
– pozove konstruktor roditeljske<br />
klase<br />
– pozove funkciju class da<br />
objektu “nalepi etiketu” tipa<br />
klase i roditeljske klase<br />
(pre v7.6)<br />
L = roditeljska_klasa(Ny,Nu,Ts)<br />
sys = class(sys, ’naziv_klase', L)<br />
classdef Potomak < Roditelj<br />
properties<br />
neki_atribut_potomka = 0;<br />
…<br />
end<br />
methods<br />
function p = Potomak(a,b,c)<br />
p = p@Roditelj(b);<br />
…<br />
end<br />
…<br />
end<br />
end
Primer jednostukog nasleĊivanja
Višestruko nasleĊivanje<br />
• klasa potomak nasleĊuje sve atribute više od jedne roditeljske klase<br />
• klasa sadrži sva polja roditeljskih klasa i obiĉno dodaje nova<br />
• realizuje se preko konstruktora pozivom class funkcije (pre v7.6)<br />
obj = class(structure,'class_name',parent1,parent2,...)<br />
• ako roditeljske klase imaju iste nazive motoda, MATLAB će izvršavati<br />
metode roditelja koji je prvi naveden u listi funkcije class<br />
classdef Potomak < Roditelj_A & Roditelj_B<br />
…<br />
end
Primer višestrukog nasleĊivanja
Agregacija<br />
• se javlja kada jedan objekat A kao polje ima drugi objekat B i tada se<br />
kaže da A agregira B<br />
• Primer: objekat rational bi mogao da sadrži dva objekta tipa polynom<br />
kao brojilac i imenilac.<br />
• metode agregiranog objekta B se mogu izvršavati samo pozivom iz<br />
metoda objekta A, zapravo, agregirani objekat B nije dostupan za<br />
korisnika
Privatne metode ĉlanice klase<br />
• klasa može sadržati privetne metode<br />
(funkcije) koje nisu vidljive<br />
korisniku već samo ostalim<br />
metodama klase<br />
Pre ver. 7.6:<br />
• privatne metode se nalaze u<br />
poddirektorijumu private<br />
odgovarajućeg klasnog<br />
direktorijuma<br />
• private direktorijum može sadržati i<br />
druge funkcije koje ne rade nad<br />
objektom, ali vrše neko korisno<br />
izraĉunavanje<br />
classdef NekaKlasa<br />
properties<br />
neki_atribut = 12.34;<br />
…<br />
end<br />
properties (SetAccess = private)<br />
privatni_atribut = 0;<br />
…<br />
end<br />
…<br />
end
Šta ovde nedostaje?<br />
• opis funkcija za faktorisanje i dekompoziciju matrica; raĉunanje ranga,<br />
kondicionog broja, norme matrice<br />
• analza signala i filtriranje; FFT algoritam<br />
• rad sa grafikom<br />
• opis korisnih naredbi: echo, input, keyboard, pause, menu, feval, disp, ...<br />
• rad sa datotekama<br />
• rad sa Debugger-om<br />
• rad sa retkim matricama<br />
• detaljan opis funkcija �<br />
• i još štošta ...<br />
Kraj �