Mathlab Lab1-2
Mathlab Lab1-2
Putem scrie comenzi în mod interactiv în linia de comandă, caz în care fiecare
linie este prelucrată imediat şi rezultatele sunt afişate, sau le putem salva în fişiere-M.
Fişierele ce conţin instrucţiuni MATLAB se numesc fişiere-M ( deoarece au extensia
„.m” ) şi sunt programe MATLAB. Un fişier-M constă dintr-o succesiune de instrucţiuni
MATLAB; având posibilitatea de a apela alte fişiere-M şi a apelării recursive.
Un program MATLAB poate fi scris sub forma fişierelor „script” sau a fişierelor
„function” ( aceste tipuri de fişiere obligatoriu cu extensia „.m” permit crearea de noi
funcţii care le pot completa pe cele existente ). Prin această facilitate, MATLAB-ul poate
fi extins la aplicaţii specifice utilizatorului, care are posibilitatea să scrie noi funcţii.
1
3. Utilizarea help-ului în MATLAB
2
Funcţii pentru controlul directoarelor şi fişierelor
Comanda utilizare
Comanda utilizare
3
clear x y şterge variabilele x şi y din memorie
4
Exemplu: Pentru matricea A = [ 1 2; 3 4 ]
A(2,:) returnează linia
3 4, iar
A(:,1) afişează
1
3
MATLAB-ul este un limbaj de expresii. Expresiile tipărite de utilizator sunt
interpretate şi utilizate. Orice instrucţiune se termină în mod normal cu Enter. Dacă
ultimul caracter al instrucţiunii este punct-virgulă „;”, instrucţiunea este executată, dar
tipărirea rezultatului este suprimată. Dacă expresia este aşa de mare încât declaraţia nu
încape pe o singură linie, se utilizează semnul „...”(trei puncte) urmat de Enter, pentru a
preciza că instrucţiunea se continuă pe linia următoare.
6. Generarea vectorilor
Pentru a genera un vector cu pas liniar MATLAB -ul oferă două metode:
• Dacă se cunosc limitele intervalului (xmin şi xmax) şi pasul (pas) dintre două
elemente, se generează vectorul cu instrucţiunea:
x = xmin : pas : xmax
Dacă pasul e negativ atunci e necesar ca xmin > xmax. Dacă se omite
specificarea valorii pasului, atunci acesta va fi luat implicit egal cu 1.
• Dacă se cunosc limitele intervalului (amin şi amax) şi numărul de elemente (N)
ale vectorului generat cu pas liniar, atunci se foloseşte instrucţiunea:
x = linspace(xmin, xmax, N)
Dacă valoarea lui N este omisă, implicit se va lua 100.
Exerciţiu: Fie v = [ 1 2 3 4 ] si fie A = [ 1 2 3 4; 5 6 7 8; 9 10 11 12 ]. Cu
ajutorul comenzii >>help nume_funcţie aflaţi ce calculează fiecare din următoarele
comenzi MATLAB:
w1=max(v),B1=min(A)
w2=mean(v),B2=mean(A)
w3=median(v),B3=median(A)
5
w4=sum(v);w5=cumsum(A)
w6=prod(v);w7=cumprod(A)
w8=sort(v), [w9, w10]=sort(v), B4=sort(A)
size(v),length(A)
7. Matrice speciale
Anumite matrice des utilizate sunt disponibile în MATLAB ca funcţii utilitare:
>>eye(n), unde n este un număr natural, returnează o matrice identitate de
dimensiune n × n. Dacă n este un număr întreg negativ, va fi returnată o matrice nulă.
Dacă sintaxa este de forma eye(A) , unde A este o matrice, atunci va fi returnată o matrice
identitate de dimensiune egală cu dimensiunea matricei A. Dacă avem sintaxa eye(m, n),
va fi creată o matrice identitate de dimensiunea maximă posibilă, iar restul va fi
completat cu zerouri până se ajunge la o matrice dimensiunea m × n.
6
>>randn(n) , unde n va fi un număr natural, returnează o matrice de
dimensiune n × n având ca elemente numere distribuite normal standard (media = 0,
dispersia =1).
>>g=[]
va genera o matrice g de dimensiune 0, dar care va exista în spaţiul de lucru.
7
Operaţia de împărţire la dreapta, element cu element, între două
tablouri este simbolizată cu operatorul punct–slash (./). Instrucţiunea este de forma:
C = A ./ B
şi reprezintă împărţirea la dreapta, element cu element, a tablourilor A şi
B, cu aceleaşi dimensiuni, rezultând elementele:
C (i,j) = A(i,j) / B(i,j)
Operaţia de împărţire la stânga, element cu element, între două
tablouri este simbolizată cu operatorul punct–backslash (.\). Instrucţiunea este de forma:
C = A.\B
şi reprezintă împărţirea la stânga, element cu element, a tablourilor A şi B, cu aceleaşi
dimensiuni, rezultând un tablou cu elementele:
C(i,j)=A(i,j)\B(i,j)=B(i,j)/A(i,j)
Prin urmare: C = A .\ B = B ./ A
Operaţia de ridicare la putere, element cu element, într-un tablou
este simbolizată cu operatorul punct-^ (.^). Instrucţiunea este de forma:
C = A.^B
şi reprezintă ridicarea fiecărui element din tabloul A la puterea indicată de valoarea
elementului din aceeaşi poziţie a tabloului B, adică:
C(i,j)=A(i,j)^B(i,j)
Dacă A e un scalar, se lasă un blank între scalar şi operatorul de ridicare la
putere.
Operaţia de transpunere a unui tablou este simbolizată de operatorul punct-
apostrof. Instrucţiunea este de forma:
B=A.'
şi liniile tabloului A vor deveni coloanele tabloului transpus B. Acest lucru face ca un
tablou B , cu dimensiunea m × n, să devină un tablou A cu dimensiunea n × m.
Operaţiile uzuale de algebră liniară cu matrice sunt simbolizate cu semnele
grafice: *, /, \, ^, ‟, şi se efectuează după regulile cunoscute din
calculul matriceal.
8
Exerciţiu: Fie A=[1 2; 3 4], B=[5 6; 7 8]. Să se calculeze:
C=A/B, D=A\B, E=A^2, F=A./B, G=A.\B, H=A.^2, I=A+2, J=B*4, K=A-2.
Cu ajutorul comenzii >>help nume_functie aflaţi ce calculează fiecare
dintre următoarele comenzi MATLAB:
v=[1 2 3], V=diag(v), W=diag(v,2)
A=[1 2 3;4 5 6;7 8 9], B=diag(diag(A))
C=inv(A), d=det(B), t=trace(B)
D=[1 2 3 4 5 6], E=D(3:5), F=D(2:2:6)
H=[1 2 3 4 5 6;2 3 4 5 6 1;3 4 5 6 1 2;...
4 5 6 1 2 3; 5 6 1 2 3 4; 6 1 2 3 4 5]
I=H(2,:), J=H(:,3), K=H(1:2,4:6), L=H([1,4],[2,4:5]),
m=1:4, n=2:2:6, M=H(m,n)
9. Tipuri de date
Matlab-ul nu conţine multe tipuri de date spre deosebire de multe alte limbaje de
programare, dar prezintă totuşi şi alte tipuri înafară de matrice şi string-uri. Cele mai
importante sunt:
tablourile multidimensionale
matricele de celule
structurile
Tablouri multidimensionale
Matricele nu sunt restricţionate la două dimensiuni. De exemplu pot fi definite
matrice tridimensionale.
Exemplu: Pentru a defini un tablou de dimensiune 2 3 4 de 1 se poate folosi
comanda:
>>A = ones(2,3,4); 2 3 4
Matrice de celule
9
Matricele de celule sunt structuri cu o mai mare flexibilitate, deoarece pot
conţine elemente de orice tip ( chiar şi alte matrice de celule ) şi pot fi de dimensiuni
diferite. Matricea de celule are o structură generală similară cu cea a matricelor de date
de bază. De exemplu, o matrice de celule 2 × 3 va avea două linii care vor conţine fiecare
câte 3 celule. Totuşi, elementele matricei pot fi de dimensiuni sau/şi tipuri diferite. O
celulă poate conţine o dată de tip char, alta o dată de tip double sau altele pot fi goale. O
altă caracteristică particulară este aceea că operaţiile matematice nu sunt definite pe
mulţimea matricelor de celule.
Voi prezenta câteva dintre căile de acces la elementele matricei de celule. Pentru
a obţine conţinutul unei celule a matricei A se foloseşte notaţia A{ , }, iar pentru a obţine
celula se foloseşte notaţia uzuală folosită pentru a accesa un element al matricei. De
exemplu, A{1,1} reprezintă conţinutul celulei ( de tip double sau char ), iar A(1,1)
reprezintă insăşi celula şi conţine o dată de tip cell. Combinând cele două notaţii putem
avea acces la elementele celulei. De exemplu, pentru a obţine primele două elemente ale
celulei A{1,1}, presupunând că ea conţine un vector, le putem accesa prin A{1,1} (1:2).
Pentru a construi o matrice de celule folosim comanda:
>>cell(m,n) care returnează un tablou de matrice de dimensiune 0, de dimensiune m × n
după care vom iniţializa elementele matricei de celule.
Exemplu 1: Comanda cell(2,3) va returna o matrice de celule de
dimensiune 2 × 3 ale cărei elemente sunt matrice de dimensiune 0.
>> cell(2,3)
ans =
[] [] []
[] [] []
Pentru a iniţializa de exemplu primul element al matricei cu matricea [1 2 3; 3 4 5] vom
folosi comanda:
>> a{1,1}=[1 2 3; 2 3 4]
a=
10
[2x3 double] [] []
[] [] []
Exerciţiu: Accesaţi elementul aflat pe poziţia (1,2) al primei celule.
C{1,1} C{1,2}
ans = ans =
1 2 3 4 5
6 7 8 9 10
C{2,1} C{2,2}
ans = ans =
11 12 13 14 15
16 17 18 19 20
Exerciţiu: Să se afişeze prima linie a primei celule, a doua coloană a
celei de a doua celule şi primele două elemente ale primei linii din celula a treia.
11
S = STRUCT('câmp1',valoare1,'câmp2',valoare2,...)
şi returnează o structură având câmpurile şi valorile corespunzătoare specificate prin
argumentele setate. Tablourile de valori trebuie să fie tablouri de celule de aceeaşi
dimensiune, celule scalare sau simple valori. Tablourile de valori sunt atribuite
câmpurilor corespunzătoare.
Exemplu: s = struct('nume',{{'Matei','Andrei'}},'cod',[1 2]);
12
plot(x,y,'or');
xlabel('x');
ylabel('sin(x)'); title('Graficul functiei sin(x)');
Realizaţi în celelalte 3 ferestre graficele funcţiilor cos(x), arcsin(u),
arccos(u) (u=-1:0.01:1) utilizând o varietate cât mai mare de linii si culori.
Observaţii:
1. Axele sunt scalate implicit astfel încât să se permită vizualizarea întregului grafic.
Pentru a avea mai mult control asupra graficului se poate utiliza funcţia axis.
Exerciţiu: Să se ploteze funcţia sinus la care se adaugă un zgomot repartizat uniform
pe intervalul [0,1] pe intervalul [0,1]. Să se seteze intervalul pe care trebuie plotată
funcţia folosind funcţia Matlab axis.
2. De fiecare dată când este apelată funcţia plot, din figură sunt eliminate (şterse)
informaţiile anterioare. Pentru a adăuga informaţii noi unei figuri (precum legende
şi etichete ale axelor) sau grafice suplimentare se utilizează funcţia hold on după
prima apelare a funcţiei plot.
3. Alte tipuri de plot-uri bidimensionale disponibile sunt:
semilogy: utilizează o scară logaritmică pe axa y şi o scară liniară pe axa
x;
semilogx: utilizează o scară logaritmică pe axa x şi o scară liniară pe axa
y;
loglog: utilizează o scară logaritmică pe ambele axe;
imagesc: reprezintă o matrice printr-o imagine colorată
hist: afişează histograma unei mulţimi de date.
13
suprafeţelor. Liniile matricei X sunt copii ale vectorului x, iar coloanele
matricei Y sunt copii ale vectorului y.
surf şi mesh: reprezintă o funcţie de două variabile ca o suprafaţă şi
respectiv ca o reţea.
contour: reprezintă punctele suprafeţei aflate la nivelul z, într-un spaţiu
bidimensional, adică sunt puncte din mulţimea A = x Domf | f ( x) z .
Fişierele script
Fişierele funcţie
Dacă prima linie a fişierului-M conţine cuvântul „function”, fişierul respectiv este
declarat ca fişier funcţie. O funcţie diferă de un „script” prin faptul că poate lucra cu
argumente. Variabilele definite şi manipulate în interiorul fişierului funcţie sunt
localizate la nivelul acesteia, deci fişierele funcţie au o zonă de memorie proprie. Prin
14
urmare, la terminarea execuţiei unei funcţii, în memoria calculatorului nu rămân decât
variabilele de ieşire ale acesteia. Comunicarea de informaţii dintre zona de memorie
alocată funcţiei şi zona de memorie principală se face prin intermediul parametrilor de
intrare şi al parametrilor de ieşire. Fişierele funcţie sunt utilizate pentru extinderea
MATLAB -ului, adică pentru crearea unor funcţii noi MATLAB.
Forma generală a primei linii a unui fişier funcţie este:
function [param_ieşire 1, …, param_ieşire m] = nume_funcţie(param_intrare 1,…,
param_intrare n)
unde:
function – este cuvântul cheie care declară fişierul ca fişier funcţie (prezenţa
lui este obligatorie);
nume_funcţie – numele funcţie, adică numele sub care se salvează fişierul
fără extensie. Trebuie să avem grijă să nu coincidă cu cel al unui fişier deja existent;
param_ieşire 1, …, param_ieşire m – parametrii de ieşire care trebuie
separaţi prin virgule şi cuprinşi între paranteze drepte. Dacă funcţia nu are parametri de
ieşire, parantenzele drepte şi semnul egal nu mai au sens.
param_intrare 1, ,…, param_intrare n – parametrii de intrare care trebuie
separaţi prin virgule şi cuprinşi între paranteze rotunde. Dacă funcţia nu are parametri de
intrare, parantenzele rotunde şi semnul egal nu mai au sens.
Aceste fişiere pot fi adăugate ca funcţii noi în MATLAB.
Comenzile şi funcţiile care sunt utilizate de noua funcţie sunt înregistrate într-un fişier cu
extensia .m. Dacă vrem să introducem un comentariu, în cadrul unui fişier, vom preceda
comentariul respectiv de semnul procent “%” . Acest lucru e foarte util de reţinut,
întrucât, atunci când creăm un fişier funcţie, este bine ca pe liniile care urmează imediat
după linia de declarare a fişierului funcţie, să introducem un comentariu prin care să dăm
informaţii despre fişierul respectiv. Astfel, atunci când un alt utilizator doreşte să afle
informaţii despre fişierul respectiv, poate tasta:
>>help nume_fisier
şi pe ecranul de comenzi va apărea comentariul introdus în fişier.
15
Exerciţiu: Screţi o funcţie cu numele medie care primeşte ca argumente 2
numere a şi b şi returnează media aritmetică, media geometrică şi media armonică a
numerelor a şi b. Scrieţi o a doua funcţie cu numele medie_gen care primeşte ca
argumente un vector şi returnează media aritmetică si media geometrică a
componentelor. Scrieţi pentru ambele funcţii comentarii si rolul lor.
Există o funcţie Matlab specială, pe care o vom folosi atunci când avem de calculat
valorile unei funcţii particulare în mai multe puncte şi nu dorim să o reţinem într-un fişier
separat. Această funcţie este denumită funţie inline şi creează un obiect inline, având ca
argument un string care reprezintă anumite expresii matematice sau comenzi pe care
dorim ca Matlab-ul să le execute. Ca argumente opţionale putem specifica argumentele
obiectului funcţie inline. De exemplu, variabila func din exemplul de mai jos reprezintă
un obiect inline.
func = inline('sin(2*pi*f + theta)','f','theta');
x = 0:.1:4*pi;
theta= pi/2;
ys = func(x, theta);
16
end instrucţiune pentru încheierea ciclurilor „for”, „while” şi „if”.
Pe lângă structura de secvenţă, aceste instrucţiuni de control permit realizarea
unor structuri de program fundamentale ( ciclul for”, ciclul „while” şi „if..else” ) ce
permit programarea structurată în MATLAB.
În MATLAB este indicată utilizarea programării vectoriale ( i.e.
prelucrarea întregului tablou, fără a folosi instrucţiuni care realizează cicluri
pentru a opera asupra unui element ) din motive de eficienţă.
if expresie_logică
secvenţă_de_instrucţiuni
end
if expresie_logică
17
secvenţă_de_instrucţiuni1
else
secvenţă_de_instrucţiuni2
end
Dacă avem nevoie de mai multe nivele de instrucţiuni „if-else” este recomandată
folosirea clauzei „elseif”, cu sau fără clauza „else”.
if expresie_logică_1
secvenţă_de_instrucţiuni 1
elseif expresie_logică_2
secvenţă_de_instrucţiuni 2
elseif expresie_logică_3
secvenţă_de_instrucţiuni 3
…………………………………………
elseif expresie_logică_n
secvenţă_de_instrucţiuni n
end
if expresie_logică_1
secvenţă_de_instrucţiuni 1
elseif expresie_logică_2
secvenţă_de_instrucţiuni 2
elseif expresie_logică_3
secvenţă_de_instrucţiuni 3
…………………………………………
else
secvenţă_de_instrucţiuni n
end
18
Instrucţiunea repetitivă FOR
while expresie
secvenţă de instrucţiuni
end
Instrucţiunile din bucla while sunt executate atâta timp cât expresie are elemente
nenule. De regulă expresie are o singură valoare TRUE sau FALSE.
Instrucţiunea break
19
Instrucţiunea return
Instrucţiunea return determină o ieşire normală din fişierul-M către funcţia care
l-a apelat sau către tastatură. Se apelează cu sintaxa:
return
Instrucţiunea error
Instrucţiunea error permite afişarea unor mesaje la întâlnirea unei erori. Se
apelează cu sintaxa:
error(„mesaj‟)
Exemplu: procedura următoare verifică dacă funcţia test a fost apelată cu două
argumente de intrare şi semnalează eroare dacă nu este îndeplinită această condiţie:
function test(x,y)
if nargin~=2
error(„Numărul argumentelor de intrare este greşit‟)
end.
Exerciţii:
Exerciţiul 1: Scrieţi codul MATLAB care trasează graficul funcţiei următoare:
2 x 8 dacă x 2
f : [-10, 10] → R, f(x) = 2
3x dacă x 2
2 , dacă i j
A(i,j) = - 1, dacă | i - j | 1
0, în rest
20
Exerciţiu 3: Să se scrie un program, utilizând o buclă while care calculează suma
elementelor vectorului x = [2 -3 8 3 2 1 -5 9 7] până când se întâlneşte un număr mai
mare ca 8.
1. Funcţii generale
Constanta şir se reprezintă printr-un şir de octeţi în care se păstrează codurile
ASCII ale caracterelor şirului respectiv. Codurile ASCII 0 – 31 sunt caractere negrafice,
iar codurile 32 – 127 sunt caractere grafice. Un şir de caractere este constituit din unul
sau mai multe caractere delimitate prin apostrofuri. Apostrofurile nu fac parte din şirul de
caractere. Pentru a introduce „apostroful‟ într-un şir de caractere se scriu două
apostrofuri.
21
Funcţia eval interpretează şirurile de caractere conţinând expresii MATLAB; se
apelează cu una dintre sintaxele:
x = eval(‘şir_de_caractere’) sau eval(‘şir_de_caractere’)
feval
Funcţia feval permite evaluarea funcţiilor; se apelează cu una dintre sintaxele:
feval(‘nume_ funţie’,x1,…, xn )
[y1,…, ym] = feval(‘nume_ funţie’,x1,…, xn )
22
Rezultatul conţine 1 în poziţiile în care elementele şirului sunt litere şi 0 în
celelalte poziţii ( numere, blank-uri, etc ).
23