You are on page 1of 15

1.

Osnovne strukture podataka u Matlabu 1

UVOD U MATLAB

Programski paket Matlab omogućava interaktivan i programski rad.


U interaktivnom radu naredbe se zadaju u promptu komandnog prozora
Matlaba i interpretiraju odmah po zadavanju. Prethodno otkucane naredbe
ostaju u istoriji i mogu se vratiti pritiskom na kursorski taster ↑ (gore),
editovati i ponovo pokrenuti. Programi se takođe pozivaju iz komandnog
prompta navođenjem imena i interpretiraju liniju po liniju.

Sl. 1. Matlab okruženje

1. OSNOVNE STRUKTURE PODATAKA U MATLABU

Razmatranje struktura podataka u Matlabu izvešćemo u interaktivnom


radu, uz pripadajuća objašnjenja, a zatim kreirati programe, sve u cilju
upoznavanja sa Matlab okruženjem i realizacijom zadataka u vezi analize
osnovnih osobina diskretnih i analognih signala i sistema.
Sve promenljive u Matlabu su matrice:

>> a=1
a =
1

>> whos
Name Size Bytes Class Attributes
a 1x1 8 double
2 Uvod u Matlab

U programskom prostoru Matlaba je definisana promenljiva a kao


matrica dimenzija 1x1 realnih brojeva dvostruke preciznosti. Naredba whos
izlistava sve definisane promenljive u Matlabovom radnom okruženju.
Stringovi su takođe matrice – vrste karaktera:

>> b='string - vektor karakter vrednosti'


b =
string - vektor karakter vrednosti

>> whos
Name Size Bytes Class Attributes
a 1x1 8 double
b 1x34 68 char

Pristup elementima matrice:


>> b(2) >> A(2,1)

ans = ans =
t 3

>> A(1,2)

>> b(10:15) ans =


2
ans =
vektor >> A(2,:)

ans =
3 4
>> A=[1 2;3 4]
>> A(:,1)
A =
1 2 ans =
3 4 1
3

Naglasimo da je prvi element neke matrice sa indeksima (1, 1), tj. da indeksi
počinju od jedan, a ne od 0 (kao kod nekih drugih programskih jezika).
Nema posebnog definisanja tipa promenljive; promenljive mogu
narednom dodelom da promene i tip i sadržaj, a matrice se automatski
proširuju:

>> A(3,4)=9

A =
1 2 0 0
3 4 0 0
0 0 0 9
1. Osnovne strukture podataka u Matlabu 3

>> whos A

Name Size Bytes Class Attributes


A 3x4 96 double

>> A = 'string'

A =
string

>> whos A

Name Size Bytes Class Attributes


A 1x6 12 char

Komentari u Matlabu počinju sa %, sve nakon procentnog znaka se


ignoriše:
>> c=[b ' i jednostavno se prosiruje'] % kreiranje slozenog stringa

c =
string = vektor karakter vrednosti i jednostavno se prosiruje

Kompleksni brojevi (i matrice) se uvode primenom predefinisanih konstanti i


i j za imaginarnu jedinicu ili kompleksnim rezultatom izračunavanja:

>> i

ans =
0 + 1.0000i

>> s=j*20

s =
0 +20.0000i

>> k=sqrt(-9)

k =
0 + 3.0000i

>> whos s k

Name Size Bytes Class Attributes


k 1x1 16 double complex
s 1x1 16 double complex

Promenljive se mogu izbrisati naredbom clear, npr. clear a b


briše promenljive a i b iz Matlabovog radnog prostora. Samo clear briše
sve trenutno definisane promenljive.
4 Uvod u Matlab

2. GRAFIČKI PRIKAZ DISKRETNIH I ANALOGNIH SIGNALA

 0, n < −1
 6, n = −1

Neka je zadat signal x (n ) = 12, n = 0
−5, n = 1

 0, n > 1

Za crtanje relevantnih odbiraka ovog signala potrebno je definisati vektore n


i x i iskoristiti naredbu stem:

>> n=[-3 -2 -1 0 1 2 3]; % znak ; na kraju komande samo ukida odziv


>> x=[0 0 6 12 -5 0 0];
>> stem(n,x)

Po zadavanju komande stem, otvara se grafički prozor Figure No. 1, kao na


slici 2.

Sl. 2. Grafički prozor dobijen izvršenjem naredbe stem

Neka je zadat signal x (n ) = exp(0.1n ) i potrebno ga je nacrtati u


opsegu n∈[-10, 10].
Način da se automatski generiše vektor sa početnom vrednošću, korakom i
završnom vrednošću je:
vektor = početna_vrednost : korak : završna_vrednost
Korak može da se izostavi, podrazumevani korak je 1.

>> n=-10:10
2. Grafički prikaz diskretnih i analognih signala 5

n =

Columns 1 through 11
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0

Columns 12 through 21
1 2 3 4 5 6 7 8 9 10

Matlab ugrađenim komandama podržava matrične argumente:

>> x=exp(0.1*n)

x =
Columns 1 through 7
0.3679 0.4066 0.4493 0.4966 0.5488 0.6065 0.6703

Columns 8 through 14
0.7408 0.8187 0.9048 1.0000 1.1052 1.2214 1.3499

Columns 15 through 21
1.4918 1.6487 1.8221 2.0138 2.2255 2.4596 2.7183

Sada možemo iscrtati signal:


>> stem(n,x)

2.5

1.5

0.5

0
-10 -5 0 5 10

Sl. 4. Grafički prikaz odbiraka signala x (n ) = exp(0.1n )

Ako pokušamo da definišemo složeniji signal x (n ) = exp(0.1n )sin(n π / 5) :


>> x=exp(0.1*n)*sin(n*pi/5)
??? Error using ==> *
Inner matrix dimensions must agree.
dobijamo poruku o grešci pri množenju. Setimo se, sve operacije koje
Matlab izvodi su matrične, pa su matrice - rezultati funkcija exp i sin obe
dimenzija 1x21, pa nisu kompatibilne za matrično množenje. Nama je, pak,
6 Uvod u Matlab

potrebno množenje element po element, što se označava dodavanjem


interpunkcijske tačke ispred operacije:

>> x=exp(0.1*n).*sin(n*pi/5)

x =

Columns 1 through 7
0.0000 0.2390 0.4273 0.4723 0.3226 -0.0000 -0.3940

Columns 8 through 14
-0.7046 -0.7787 -0.5319 0 0.6496 1.1616 1.2838

Columns 15 through 21
0.8769 0.0000 -1.0710 -1.9152 -2.1166 -1.4457 -0.0000

“Kandidati za tačkicu” su operacije množenja *, deljenja / i stepenovanja ^.


Slikama se mogu dodati oznake po x osi, y osi, naslov, staviti mreža:

>> stem(n,x)
>> xlabel('n');
>> ylabel('x(n)')
>> title('Primer signala x(n)');
>> grid
Primer signala x(n)
1.5

0.5

0
x(n)

-0.5

-1

-1.5

-2

-2.5
-10 -5 0 5 10
n

Sl. 5. Grafički prikaz odbiraka signala x (n ) = exp(0.1n )sin(n π / 5)

Analogne signale možemo iscrtavati tako što napravimo finu podelu


vremenske ose i koristimo umesto stem naredbu plot:

>> t=-10:0.01:10;
>> x=exp(0.1*t).*sin(pi/5*t);
>> plot(t,x);
>> xlabel('t');
>> ylabel('x(t)')
>> title('Primer signala x(t)');
2. Grafički prikaz diskretnih i analognih signala 7

Rezultat izvršavanja navedenog niza Matlab instrukcija je grafik


predstavljen slikom 6.

Primer signala x(t)


1.5

0.5

x(t)
-0.5

-1

-1.5

-2

-2.5
-10 -5 0 5 10
t

Sl. 6. Grafički prikaz signala x (t ) = exp(0.1t )sin(t π / 5)

Matlab ima veoma dobro urađen help sistem (Help meni u Matlab
komandnom prozoru vodi u html sistem help-a). Međutim, i u komandnom
promptu, korišćenjem naredbe help moguće je dobiti informacije o svim
grupama Matlab-ovih funkcija i struktura. Ako je poznato ime grupe
funkcija, npr. matlab\elfun – elementarne matematike funkcije, ili ime
funkcije za koje nam treba pomoć, oni se mogu navesti i dobiti u
komandnom prozoru tekstualna pomoć vezana za datu grupu, odnosno
funkciju. Npr. ako želimo da prethodnu signal iscrtamo u crvenoj boji,
potrebno nam je objašnjenje za način zadavanja boja i tipa linije u naradbi
plot, pa kucamo help plot i dobijamo opis načina korišćenja i parametre
te naredbe. Naredba plot(t,x,’r’) će ostvariti željenu promenu boje.
Takođe, može se u helpu naredbe plot videti i način korišćenja kada se želi
iscrtati više signala na istom grafiku. Tada se koristi proširena forma
naredbe plot gde se sukcesivno navode vektori x i y argumenata za sve
signale koji se crtaju, sa opcionim navođenjem stringa formata za boje i tip
linija pojedinačnih signala. Npr. ako se, pored signala x(t) želi prikazati i
signal y(t)=exp(0.1t)cos(tπ/5), sledeći Matlab kod će dati željeni dijagram,
predstavljen na slici 7.

t=-10:0.01:10;
x=exp(0.1*t).*sin(pi/5*t);
y=exp(0.1*t).*cos(pi/5*t);
plot(t,x,’b’,t,y,’g’);
8 Uvod u Matlab

-1

-2

-3
-10 -5 0 5 10

Sl. 7. Istovremeni grafički prikaz signala x(t) i y(t)

3. MATLAB PROGRAMI – SKRIPTOVI

Matlab skriptovi su standardne ASCII datoteke sa ekstenzijom ”.m”.


Naredbe u programu Matlab sukcesivno interpretira i izvršava do završetka
programa, odnosno do prve greške u programu. Iako bilo koji editor teksta
može da napravi ASCII datoteku za program, Matlab programski paket
sadrži i editor teksta, koji podržava integrisani razvoj Matlab programa
(pokretanje Matlab programa iz editora, debugging, breakpoints itd).
Izborom stavke menija: File/New/Script u Matlab-ovom komandnom
prozoru, pokreće se Matlab-ov programski editor (sl. 8), u kojem možemo
kreirati novi program ili modifikovati već postojeće programe.
Radi demonstracije osnovnih naredbi za ulaz i izlaz, ukucajmo u
editoru jednostavan program za unos broja i godine indeksa, njihovo
sabiranje i ispis:

b=input('Unesite broj indeksa:');


g=input('Unesite godinu indeksa:');
disp(['Uneti parametri: b=' num2str(b) ', g=' num2str(g)]);
disp(['Zbir=' num2str(b+g)]);

Preporučljivo je programe snimati i čuvati u ličnom folderu, a ne u


ponuđenom Matlab-ovom work folderu (izborom opcije menija editora
File/Save As). Ime programa treba da bude jednosložno i u skladu sa
Windows konvencijama za imenovanje datoteka, da bi mogli navođenjem
imena programa u Matlabovom komandnom prozoru da isti pokrenemo.
Snimimo program u lični folder (npr. d:\Sale Rakic\Nastava), pod imenom
primer1 (ekstenziju ".m" dodaje sam editor).
3. Matlab programi – skriptovi 9

Sl. 8. Matlab-ov programski editor


Sada treba preći u Matlab-ov komandni prozor i za radni folder proglasiti
lični folder u kome je program, kao što je prikazano na slici 9.

Sl. 9. Promena tekućeg radnog foldera Matlab okruženja

Navođenjem imena programa u komandnom promptu, nalaže se Matlabu da


pokrene program. Korisniku programa se pruža mogućnost da unese
podatke, a zatim izračunava i ispisuje zbir.

>> primer1

Unesite broj indeksa:326↵

Unesite godinu indeksa:2010↵
Uneti parametri: b=326, g=2010
Zbir=2336
10 Uvod u Matlab

4. MATLAB FUNKCIJE

U Matlabu je, kao i u većini drugih programskih jezika, osim korišćenja


ugrađenih funkcija, moguće kreirati i potpuno ravnopravno koristiti i
sopstvene (korisničke) funkcije. Kao i Matlab skript, funkcija se kreira tekst
editorom u vidu ASCII datoteke sa ekstenzijom ".m". Formalna razlika
funkcije i skripta je to što prva linija funkcije obavezno počinje službenom
rečju function i definiše ime i formalne parametre funkcije:
function [out_arg_1, out_arg_2,...] = ime_funkcije(in_arg_1, in_arg_2,...)

Službena reč end označava kraj funkcije, a funkcija se može i ranije završiti
primenom službene reči return. U većini slučajeva, jedna datoteka sadrži
samo jednu funkciju, pa se tada završetak izvršavanja funkcije ostvaruje i
dostizanjem fizičkog kraja datoteke.
U telu funkcije vidljive su sve promenljive definisane u workspace-u
Matlaba, dok su promenljive koje se kreiraju u funkciji vidljive samo toj
funkciji u toku njenog izvršenja.
Formalnim izlaznim argumentima funkcije out_arg_1, out_arg_2,...
dodeljuju se vrednosti u telu funkcije, na osnovu formalnih ulaznih
argumenata in_arg_1, in_arg_2,..., varijabli kreiranih u samoj funkciji,
varijabli iz Matlabovog workspace-a, kao i eventualnim pozivima drugih
funkcija. Treba napomenuti da i ulazni i izlazni argumenti mogu da budu
matrični.
Poziv i korišćenje izlaznih argumenata funkcije ilustrovaćemo na primeru
pozivanja Matlab-ove funkcije sort, za sortiranje elemanata u matricama.
Prvo kreiramo vektor nesortiranih vrednost, npr:
> niz = [pi -1 2 0.3]

Iako funkcija sort ima veći broj ulaznih i izlaznih argumenata (videti help
sort), koristimo najjednostavniju formu poziva, sa samo jednim ulaznim
argumentom – nizom koji treba sortirati:
>> sort(niz)

ans =
-1.0000 0.3000 2.0000 3.1416

Pošto nije izvršena dodela rezultata rada funkcije nijednoj promenljivoj,


sortirani niz je dodeljen generičkoj promenljivoj ans.
Ukoliko poziv funkcije izvršimo sa dodelom njenog prvog formalnog izlaznog
argumenta nekoj promenljivoj, ta promenljiva će i dobiti vrednost prvog
formalnog izlaznog argumenta funkcije sort:
>> sortirani_niz = sort(niz)
4. Matlab funkcije 11

sortirani_niz =
-1.0000 0.3000 2.0000 3.1416

Od funkcije sort se mogu tražiti i dva izlazna argumenta: sortirani niz i


vektor indeksa sortiranih elemenata:
>> [sortirani_niz, ind] = sort(niz)

sortirani_niz =
-1.0000 0.3000 2.0000 3.1416

ind =
2 4 3 1

Ako se vratimo na prethodne jednostavnije primere poziva funkcije, ostaje


pitanje: šta se zbilo sa drugim izlaznim argumentom funkcije, kada ga niko
nije tražio prilikom poziva? Odgovor je da, bez obzira koliko neka funkcija
ima predviđenih izlaznih argumenata, Matlab dodeljuje samo one koji su
pozivom te funkcije traženi, dok se ostali ignorišu.
Što se tiče same funkcije, za postojanje svih predviđenih formalnih ulaznih
argumenata i kreiranje svih predviđenih formalnih izlaznih argumenata
mora se starati kreator i korisnik funkcije. Matlab je u tom pogledu
fleksibilan, pa će grešku u vidu nepostojanja npr. predviđenog, ali
nedefinisanog izlaznog argumenta, prijaviti tek prilikom izvršavanja
programa, koji poziva predmetnu funkciju i očekuje taj izlazni argument.
Kreirajmo sada svoju funkciju decsort koja će vršiti sortiranje niza
(vektora) po opadajućem redosledu elemenata. Iskoristićemo postojeću
funkciju sort u telu naše funkcije:
function [sortirani_niz, ind] = decsort(niz)
[sortirani_niz, ind] = sort(-niz);
sortirani_niz = -sortirani_niz;
end

Funkciju treba snimiti u datoteku pod nazivom decsort.m i to u folder, koji


je dostupan Matlab-u kao Current folder. Primer poziv naše funkcije u
Matlab-ovom komandnom promptu je:
>> [sortirani_niz, ind] = decsort(niz)

sortirani_niz =
3.1416 2.0000 0.3000 -1.0000

ind =
1 3 4 2

Pozivi mogu biti i u jednostavljijim formama, kako je prethodno izvedeno za


Matlab-ovu funkciju sort, a treba primetiti da je način korišćenja
korisničkih funkcija potpuno isti, kao i za postojeće Matlab-ove funkcije,
odnosno da su korisničke funkcije ravnopravne u upotrebi sa ugrađenim
Matlab-ovim funkcijama.
12 Uvod u Matlab

5. RELACIONI I LOGIČKI OPERATORI

Standardni relacioni operatori, realizovani u Matlab-u, su: < (manje), <=


(manje ili jednako), > (veće), >= (veće ili jednako), == (jednako), ~= (različito).
U Matlabu, rezultat relacionog operatora (poređenja) je tipa logical i može
biti: 0 (netačno) ili 1 (tačno). Dobijene vrednosti 0 i 1 tipa logical se mogu
koristiti, bez eksplicitne konverzije u tip double, za izračunavanje složenijih
numeričkih izraza:
>> rezultat=(2==0)

rezultat =
0

>> whos rezultat

Name Size Bytes Class Attributes


rezultat 1x1 1 logical

>> rezultat2=(rezultat+2)*cos(pi/2)

>> rezultat2=(rezultat+2)*cos(pi/4)

rezultat2 =
1.4142

>> whos rez*

Name Size Bytes Class Attributes


rezultat 1x1 1 logical
rezultat2 1x1 8 double

Takođe, treba imati u vidu da je matrica osnovna struktura podataka u


Matlabu, pa je moguće i međusobno relaciono poređenje matrica, gde je
rezultat - matrica logičkog tipa. Npr, može se porediti vektor sa konstantom:
>> vektor = [3 0 2 4.5 -1];
>> rezultat = (vektor >= 3)

rezultat =
1 0 0 1 0

>> whos rezultat

Name Size Bytes Class Attributes


rezultat 1x5 5 logical

Standardni logički operatori su: & (i), | (ili), ~ (negacija). Imajući u vidu da
logički operatori, takođe, rade sa matricama, nastavak prethodnog primera
bi mogao biti:
>> rezultat2 = (vektor >= 3)|(vektor <0)

rezultat2 =
1 0 0 1 1
6. Kontrolne strukture Matlaba 13

6. KONTROLNE STRUKTURE MATLABA

Tok izvršenja Matlab programa (skripta i funkcije) može se regulisati


primenom standardnih kontrolnih struktura: for, while, if, switch.

Struktura for. Najjednostavniji način korišćenja for strukture je:


for brojač = početna_vrednost:korak:krajnja_vrednost
blok komandi
end

Promenljiva brojač uzima vrednosti, počev od početna_vrednost sa


korakom korak i zaključno sa krajnja_vrednost, a blok komandi se
izvršava za svaku pojedinačnu vrednost promenljive brojač.
Npr:
for n = 0:10
x(n+1) = sin(pi*n/10);
end

U prethodnom primeru treba primetiti da se vodi računa da ne postoji x(0),


kao i da je ceo primer samo demonstrativan i neoptimalan, jer se cela for
konstrukcija može zameniti direktnom dodelom:
n = 0:10;
x = sin(pi*n/10);

Može se uočiti da, u prethodno prikazanom načinu korišćenja, brojačka


promenljiva preuzima vrednosti iz automatski generisanog vektora, što je
samo poseban slučaj korišćenja for strukture, koja ima opšti oblik:
for brojač = opseg_brojača
blok komandi
end

Promenljiva opseg_brojača može biti bilo kakav vektor (ne samo


automatski generisan):
for a = [1 5 -sin(pi/3) 0 -3]
disp(['Kroz ovaj prolaz vrednost promenjive a je: ' num2str(a)])
end

Kroz ovaj prolaz vrednost promenjive a je: 1


Kroz ovaj prolaz vrednost promenjive a je: 5
Kroz ovaj prolaz vrednost promenjive a je: -0.86603
Kroz ovaj prolaz vrednost promenjive a je: 0
Kroz ovaj prolaz vrednost promenjive a je: -3

U najopštijem slučaju, opseg_brojača može biti matrica, gde brojač uzima


kolonu po kolonu matrice opseg_brojača, za svaki prolaz kroz for petlju:
A = [1 2; 3 4];
for a = A
a
end
14 Uvod u Matlab

a =
1
3

a =
2
4

Ukoliko se u bloku komandi unutar for petlje naiđe na komandu break,


prekidaju se iteracije i nastavlja izvršenje programa nakon for petlje (tačnije,
nakon end instrukcije koja završava for strukturu).
Nailazak na komandu continue, unutar for petlje, prekida izvršavanje
bloka komandi za tekuću vrednost brojačke promenljive i momentalno se
prelazi na izvršavanje bloka komandi za narednu iteraciju (za narednu
dedeljenu vrednost brojača).

Struktura while. Opšti oblik while strukture je:

while izraz
blok komandi
end

Izraz može biti double ili logička promenljiva, kao i rezultat složenijih
numeričkih, relacionih i logičkih operacija. Najčešće je dovoljno da logički
izraz bude skalaran, kada se while petlja izvršava dok je logički izraz tačan,
odnosno numerički izraz različit od nule. Npr:
q = pi
while q > 0.1
q = q/2
end

U opštem slučaju, ukoliko je izraz matrica, while petlja se izvršava dok svi
elementi numeričke matrice imaju realni deo različit od nule, odnosno dok
su svi elementi logičke matrice tačni.
U okviru bloka komandi unutar while strukture mogu se naći i komande
break i continue, sa istim efektom kao i kod for strukture.

Struktura if. Opšti oblik if strukture je:

if izraz1
blok komandi 1
elseif izraz2
blok komandi 2
elseif izraz3
blok komandi 3
.
.
else
blok komandi else
end
6. Kontrolne strukture Matlaba 15

Prilikom nailaska na if strukturu, testira se izraz1 i, ukoliko je tačan,


prelazi se na izvršenje blok komandi 1, te nastavlja izvršenje programa
nakon if strukture (nakon end instrukcije koja završava if strukturu).
Ukoliko izraz1 nije tačan, prelazi se na testiranje izraz2. Ukoliko je on
tačan, prelazi se na izvršenje blok komandi 2 i nastavlja izvršenje
programa posle if strukture. I tako redom – testiranje narednih izraza se
vrši samo ukoliko nijedan prethodni nije zadovoljen, sa finalnim
izvršavanjem bloka komandi iza else, ukoliko nijedan izraz iz if i svih elseif
nije tačan.
Obratiti pažnju da je elseif jednosložna službena reč (ne else if). Opšti
oblik if strukture se može koristi u pojednostavljenoj formi, tj. delovi
strukture sa elseif-ovima i else su opcioni.

Struktura switch. Opšti oblik switch strukture je:


switch izraz
case vrednost1
blok komandi 1
case {vrednost2, vrednost3, ...}
blok komandi 2
.
.
otherwise
blok komandi otherwise
end

Izvršava se blok komandi iza case dela, za koji je tačno da izraz ima
navedenu vrednost (kao vrednost1) ili bilo koju, od navedenih više
vrednosti (kao {vrednost1, vrednost2}). Ukoliko izraz nije jednak ni
jednoj predviđenoj case vrednosti, izvršava se blok komandi otherwise.
Primetimo da, za razliku od nekih drugih programskih jezika, ne postoje
break komande između case delova. Takođe switch struktura je pomalo
redundantna, s obzirom na kompletnost postojeće if strukture.

You might also like