24.02.2013 Views

A1 Matlab

A1 Matlab

A1 Matlab

SHOW MORE
SHOW LESS

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 �

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!