Sunteți pe pagina 1din 34

5.

LIMBAJUL MATLAB - INSTRUCIUNI


I FUNCII DE CONTROL SPECIFICE
Programele MATLAB sunt scrise pentru a realiza numai pai secveniali,
operaiile fiind executate una dup alta.
5.1. Instruciuni de control logic
Uneori, este necesar repetarea unui set de instruciuni, atta timp ct o
condiie nu este realizat sau repetarea unui grup de instruciuni, de un anumit
numr de ori. Alteori, este necesar terminarea normal sau forat a unui ciclu sau
rentoarcerea execuiei la o funcie precizat. Nu lipsit de interes este i afiarea
unor mesaje de eroare.
Instruciunile de control logic (condiionale) utilizeaz operatori relaionali i
operatori logici.
Instruciuni condiionate
n cadrul unui algoritm este deseori necesar o selecie a grupului de
instruciuni ce urmeaz a fi executate, condiionate de valoarea de adevr a unei
expresii. Grupul de instruciuni care se repet este numit i corpul ciclului.
Instruciunea if poate fi implementat ca instruciune if simpl; poate
include clauzele else sau elseif.
Forma general a unei instruciuni if simpl, este:
if expresie logic
grup de instruciuni
end

Dac expresia logic este adevrat, se execut grupul de instruciuni
cuprinse ntre if i end. Dac expresia logic este fals, se trece la prima
instruciune, care urmeaz dup instruciunea end.
Pentru o citire mai uoar, ct i pentru o urmrire a grupurilor de instruciuni
care se execut, se procedeaz la decalarea (deplasarea ) acestora, lucru realizat
automat, de editorul intern al Matlab.
Un exemplu de utilizare a instruciunii if simpl este secvena Matlab:
if a < 10
b=b+1
c=c+a
end.
Dac a este un scalar i dac a<10, b se incrementeaz cu 1, iar c cu a.
Instruciunea if poate fi inclus n interiorul altei instruciuni if, ca n
exemplul urmtor:
Limbajul Matlab instruciuni i funcii de control specifice 75
if expresie_logic_A
grupul_de_instriciuni_1
if expresie_logic_B
grupul_de_instruciuni_2
end
grupul_de_instruciuni_3
end
grupul_de_instruciuni_4

Atta timp ct expresie_logic_A este 1 (ADEVRAT), se execut
grupul_de_instruciuni_1 i grupul_de_instruciuni_3. Dac i expresie_logic_B
este 1 (ADEVRAT), se execut grupul_de_instruciuni_2, naintea executrii
grupului de instruciuni 3. Dac expresie_logic_B este 0 (FALS), nu se execut
grupul_de_instruciuni_2, chiar dac expresia logic A continu s fie adevrat.
Dac expresie_logic_A este 0 (FALS), se trece la grupul de instruciuni
4,fr a mai executa grupurile de instruciuni 13. De altfel, grupul de instruciuni
4 se execut indiferent de valoarea de adevr a expresiilor logice A i/sau B.
Pentru a evidenia grupurile de instruciuni care se execut, funcie de
condiiile pe care le ndeplinesc, se utilizeaz identarea (deplasarea instruciunilor
respective spre dreapta cu cteva spaii).
Fie urmtorul exemplu de utilizare a instruciunilor condiionale if
succesive:
b=0
a=1
if a < 10
b=b+a
c=b+a
a=a+b
if b < a
b=b+a
end
c=c.^2
a=a+1
end
d=a*b+c*a

n exemplul de mai sus, a=1 i deci a<10, astfel c, se execut instruciunile,
b=b+a
c=b+a
a=a+b
rezultnd b=1, c=2, a=2.
Cum b<a, se execut instruciunea b=b+a, rezultnd b=3 i apoi se trece la
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 76
grupul de instruciuni,
c=c.^2
a=a+1
dup care se execut instruciunea,
d=a*b+c*a
rezultnd, n final, a=3, c=4 i d=21.

Dac a este un vector sau o matrice, condiia a<10 este adevrat numai dac
fiecare element al lui a este mai mic de 10. Dac a i b sunt vectori sau matrice,
atunci <a numai dac fiecare pereche (b, a) verific aceast condiie.
Dac a sau b este scalar, comparaia se face ntre fiecare element al matricei
cu scalarul extins la o matrice.

Clauza else este utilizat pentru a executa un set de instruciuni, dac
expresia logic este ADEVRAT i un alt set de instruciuni, dac expresia
logic este FALS.
Forma general a instruciunii if, combinat cu clauza else (numit i
instruciunea if-else) este:
if expresie_logic_A
grupul_de_instriciuni_1
else
grupul_de_instruciuni_2
end

Dac expresia logic A este adevrat, se execut grupul de instruciuni 1, iar
dac este fals, se execut grupul de instruciuni 2.
Un exemplu de aplicare a instruciunii if-else este cel pentru descrierea
funciei,

( )

2. y dac , y y 2
2 y dac , 2 y y 3
g(y)
2
3 2

< +
>
=
a crei descriere MATLAB este:
if y >= 2
g(y)=3*y^2*(y-2)^3
else
g(y)=2*y+2
end

Clauza elseif se utilizeaz dac funcia de calculat are mai multe niveluri
de instruciuni if-else i este mai dificil determinarea expresiei logice adevrate.
Structura general a utilizrii clauzei elseif este:
if expresie_logic_A
grupul_de_instriciuni_1
elseif expresie_logic_B
Limbajul Matlab instruciuni i funcii de control specifice 77
grupul_de_instruciuni_2
elseif expresie_logic_C
grupul_de_instruciuni_3
end

Modul de evaluare este urmtorul:
dac expresia logic A este adevrat, este executat numai grupul de
instruciuni 1;
dac expresia logic A este fals i expresia logic B este adevrat, se
execut numai grupul de instruciuni 2 ;
dac expresiile logice A i B sunt false, iar expresia logic C este
adevrat, se execut numai grupul de instruciuni C ;
dac mai multe expresii logice sunt adevrate, prima instruciune logic
adevarat determin grupul de instruciuni care este executat prima dat ;
dac nici o expresie logic nu este adevrat, nu se execut nici un grup de
instruciuni din structura if-elseif.

Clauza elseif poate fi combinat cu clauza else ntr-o structur general de
forma:
if expresie_logic_A
grupul_de_instriciuni_1
elseif expresie_logic_B
grupul_de_instruciuni_2
elseif expresie_logic_C
grupul_de_instruciuni_3
else
grupul_de_instruciuni_4
end

Dac nici o expresie logic (AC) nu este adevrat, se execut grupul de
instruciuni 4.

De exemplu, dac trebuie generat o matrice X cu n linii i n+1 coloane, ale
crei elemente sunt:

j i dac , 1
j i dac 0,
j i dac , 1 -
X

>
=
<
=

Cu secvena Matlab:
n=4;
for i=1:n
for j=1:n+1
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 78
if i==j
X(i,j)=0
elseif i<j
X(i,j)=-1
else
X(i,j)=1
end
end
end
se obine,
X =
0 -1 -1 -1 -1
1 0 -1 -1 -1
1 1 0 -1 -1
1 1 1 0 -1.
Instruciuni pentru ncheierea ciclurilor
Instruciunea care ncheie ciclurile (if, for, while, switch, try) este end,
fiecare pentru o instruciune de deschidere a unui ciclu.
End mai este utilizat i ca ultim index ntr-o matrice sau pornind de la
acesta, s poat identifica elementele matricei, avnd ca baz ultimul element. n
acest context, pentru X=[1 2 3 4; 5 6 7 8; 9 10 11 12], rezult c end este 12, iar:
X(end)=12, X(end-3)=X(9)=11, X(end-10)=X(2)=5.
Instruciuni repetitive
Instruciunea for este folosit pentru repetarea unui grup de instruciuni din
corpul buclei, de un anumit numr de ori, cunoscut iniial.
Forma general a instruciunii for este:
for index=expresie
grupul de instruciuni
end
unde: index este numele contorului, expresie este un scalar, un vector sau o
matrice, iar grupul de instruciuni sunt, una sau mai multe expresii Matlab.
n aplicaii, de cele mai multe ori, index=expresie este de forma:
k=valoare_iniial : pas : valoare_final,
unde k este indexul cont, valoare_iniial este prima valoare a lui k, pas este pasul
la care este calculat indexul, iar valoare_final este cea mai mare valoare pe care o
poate lua k.
La fiecare pas este calculat indexul k, care este folosit n grupul de
instruciuni. Dac expresie este o matrice, atunci ciclarea se face pe coloane.
Pentru un ciclu for, cu pasul negativ sau nentreg, se genereaz mai nti un
vector cu pasul i limitele dorite i apoi se citesc valorile acestuia, n cadrul buclei
Limbajul Matlab instruciuni i funcii de control specifice 79
for.
La folosirea buclei for trebuie respectate urmtoarele reguli:
indexul buclei for trebuie s fie o variabil;
dac expresia este o matrice goal, bucla nu se execut i se va trece la
urmtoarea instruciune, dup instruciunea end;
dac expresia este un scalar, bucla se execut o singur dat, cu indexul
dat de valoarea scalarului ;
dac expresia este un vector linie, bucla se execut de attea ori cte
elemente are vectorul i de fiecare dat, indexul are valoarea egal cu
urmtorul element din vector ;
dac expresia este o matrice, indexul va avea la fiecare iteraie valorile
coninute n urmtoarea coloan a matricei ;
la terminarea ciclurilor for, indexul are ultima valoare utilizat;
dac se utilizeaz operatorul : pentru a definii expresia, sub forma:
for k=k_init : pas : k_final
bucla se execut de 1
pas
k_init k_final
+
(


= n ori, dac n este pozitiv
i nu se execut dac n este negativ. Am notat prin [] valoarea ntreag
a numrului.

De exemplu, instruciunea,
for k=3:5:95
se execut de 9 1 8 1
11
3 95
= + = +
(


= n ori. Prin aceasta, valorile lui k sunt : 3, 14,
25, 36, 47, 58, 69, 80, 91. Bucla nu se va executa pentru valori mai mari dect 95.
Ca exemplu de aplicare a instruciunii for, considerm generarea matricei
Hilbert de ordinul 4, ale crei elemente sunt date de expresia
1 j i
1
j) H(i,
+ +
= .
Secvena Matlab este:
n=4;
for i=1:n;
for j=1:n;
H(i,j)=1/(i+j+1);
end
end
care conduce la,
H =
0.3333 0.2500 0.2000 0.1667
0.2500 0.2000 0.1667 0.1429
0.2000 0.1667 0.1429 0.1250
0.1667 0.1429 0.1250 0.1111
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 80

Instruciunea while este o structur care se utilizeaz pentru reperatea unui
set de instruciuni, atta timp ct o condiie specificat este adevrat. Formatul
general al acestei instruciuni de control este:
while expresie
grup de instruciuni
end
Grupul de instruciuni se execut ct timp expresie are toate elementele
nenule, iar expresie are de obicei forma:
expresie_1 condiie expresie_2,
unde condiie este unul dintre operatorii relaionali: ==, <, >, <=, >=, or ~=.
Cnd condiia este verificat (expresia este adevrat logic), se execut
grupul de instruciuni. Dup ce se execut grupul de instruciuni, condiia este
retestat. Cnd condiia este din nou adevrat, grupul de instruciuni se execut
iar. Cnd condiia este fals, se trece la urmtoarea instruciune dup instruciunea
end. Dac expresia este totdeauna adevrat logic (valoarea acesteia este diferit de
zero), bucla devine infinit; dintr-o bucl infinit se iese forat, prin apsarea
concomitent a tastelor [ Ctrl]+[C].
De exemplu, dac A=[1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16], atunci
secvena Matlab:
E = 0*A; F = E + eye(size(E)); N = 1;
while norm(E+F-E,1) > 0,
E = E + F; F = A*F/N; N = N + 1;
end
conduce la:
N =
98
F =
0.0111 0.0125 0.0140 0.0155
0.0256 0.0289 0.0323 0.0357
0.0401 0.0454 0.0507 0.0560
0.0546 0.0618 0.0690 0.0762
E =
1.0e+015 *
0.3523 0.3990 0.4456 0.4923
0.8140 0.9218 1.0296 1.1374
1.2757 1.4447 1.6136 1.7825
1.7375 1.9675 2.1976 2.4276.
Instruciunea break
Instruciunea break se utilizeaz pentru a iei dintr-o bucl, nainte ca aceasta
s se fi terminat. Se recomand a fi utilizat dac o condiie de eroare este detectat
n interiorul buclei. Instruciunea break nceteaz execuia ciclurilor for i while.
Limbajul Matlab instruciuni i funcii de control specifice 81
n cazul unor cicluri intercalate, break comand ieirea din ciclul cel mai
interior. Se apeleaz cu sintaxa:
break
Pentru exemplificare, considerm secvena:
for i=1:10
a(i)=i*10
break
b(i)=a(i)+5
end
care calculeaz numai a(1), rezultnd:
a =
10
Instruciunea continue
Instruciunea continue transfer controlul la urmtoarea iteraie din bucla for
sau while n care apare, srind celelalte instruciuni rmase ntre aceasta i end.
Este util pentru cazul unor bucle mari, cnd trebuie srite anumite instruciuni.
Pentru a exemplifica modul de lucru, se dau dou secvene scurte:
fr instruciunea continue:
for i=1:10
a(i)=i*10
b(i)=a(i)+5
end
cnd se calculeaz,
a =
10 20 30 40 50 60 70 80 90 100
b =
15 25 35 45 55 65 75 85 95 105
cu instruciunea continue :
for i=1:10
a(i)=i*10
continue
b(i)=a(i)+5
end
cnd se calculeaz numai a, nu i b.

Blocuri de instruciuni
Blocul switch, funcie de valoarea expresiei switch_expr, permite transferul
execuiei unei anumite secvene din cadrul unui bloc ce se gsete ntre dou
expresii: case case_expr, case {case_expr1, case_expr2, case_expr3,...}, sau
otherwise. Forma general a instruciunii switch este:
switch switch_expr
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 82
case case_expr,
statement, ..., statement
case {case_expr1, case_expr2, case_expr3,...}
statement, ..., statement
...
otherwise
statement, ..., statement
end

Dac case este de forma case {case_expr1, case_expr2, case_expr3,...},
atunci trebuie s fie adevrat cel puin una dintre case_expr1, case_expr2,
case_expr3,. Dac nici una dintre case_expr nu este adevrat, se execut
secvena dintre otherwise i end, dac aceast secven exist. Nu se execut dect
o secven valabil i apoi se iese din bloc.
De menionat c, switch_expr poate fi scalar sau caracter (string). Dac este
scalar, atunci se transfer controlul secvenei pentru care case_expr= switch_expr.
Dac switch_expr este de tip caracter, se execut setul de instruciuni care ncep cu
case, pentru care instructiunea strcmp(switch_expr,case_expr) are valoarea 1.
Instruciunea strcmp(S1,S2) compar semnele S1 i S2 i, dac sunt la fel,
returneaz 1 i 0, dac sunt diferite. Dac S1 i S2 sunt matrice celule de semne,
acestea trebuie s aib aceeai dimensiune, iar comparaia se face pentru fiecare
celul n parte. Semnele S1 i S2 sunt din setul de caractere internaionale.
Considernd c METHOD este o variabil de tip caracter, un exemplu de
aplicare a blocului switch este:
switch lower(METHOD)
case {'linear','bilinear'}
disp('Method is linear')
case 'cubic'
disp('Method is cubic')
case 'nearest'
disp('Method is nearest')
otherwise
disp('Unknown method.')
end

Un alt bloc de instruciuni este blocul try-catch. Blocul try are forma
general:
try
statement; ..., statement;
catch
statement; ...; statement;
end

n mod normal, se execut numai seturile de instruciuni dintre try i catch.
Limbajul Matlab instruciuni i funcii de control specifice 83
Dac se ntlnete o eroare pn la instruciunea catch, atunci aceasta este captat
n lasterr i se va executa setul de instruciuni dintre catch i end. Dac i n
aceast secven se ntlnete o eroare, execuia se oprete i eroarea este memorat
n lasterr. Controlul execuiei se transfer unui alt eventual bloc try-catch.
Instruciunea lasterr memoreaz ultima eroare ntlnit n execuia Matlab.
Chemat simplu lasterr, ea returneaz ultima eroare ntlnit. Chemat lasterr(''),
reseteaz matricea erorilor, pregtind-o pentru urmtoarea secven de rulare.
Instruciunea return
Instruciunea return comand o ieire normal din fiierul de tip M
(nume_fiier*m) ctre funcia care l-a apelat sau ctre tastatur. Se apeleaz cu
sintaxa:
return
Un exemplu de aplicare este:
function d = det(A)
if isempty(A)
d = 1;
return
else
...
end
5.2. Instruciuni pentru evaluare i execuie
Funcia eval execut o expresie Matlab dat sub form de caractere, s, putnd
fi apelat sub forma eval(s). De exemplu, apelat sub forma,
eval('sin(pi/3)')
evalueaz sin(pi/3) i returneaz rezultatul
ans =
0.8660
Dac expresia Matlab lucreaz cu matrice, atunci evaluarea se face pentru
orice element al matricei, ca de exemplu:
x=[1 2 3 4 5] ; eval('x.^2+x+2'), care d rezultatul,
ans =
4 8 14 22 32
Un alt exemplu este selectarea programului de executat, funcie de numrul
introdus de la tastatur:
D = ['odedemo '
'quaddemo'
'fitdemo '];
n = input('Select a demo number: ');
eval(D(n,:))

SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 84
Funcia evalc este asemntoare cu eval, cu deosebirea c expresia s, sub
form de caractere, este preluat printr-o comand window i este returnat ntr-o
matrice de ieire, T, avnd liniile separate. Apelarea se face cu sintaxa T=evalc(s).
Apelarea se face asemntor cu eval.
De notat c la apelarea lui evalc sunt inactive comenzile diary, more i input.

Funcia feval execut o anumit funcie, specificat sub form de caractere i
returneaz mrimile de ieire. Structura general este de forma:
[y1,..,yn] = feval(F,x1,...,xn)
n care x1,...,xn sunt argumentele de intrare pentru funcia F, dat sub form de
character, iar y1,..,yn sunt argumentele de ieire ale funciei F.
Un exemplu de mod de apelare este:
[hm,hv,hmol]=feval('Haert',35)
care are acelai rezultat,
hm =
309.5269
hv =
400.0208
hmol =
8.9661e+003
ca i [hm,hv,hmol]=Haert(35).

Funcia evalin evalueaz o expresie din spaiul de lucru, fiind apelat cu
sintaxa [X,Y,Z,...] = evalin(WS,'expression'), n care WS este spaiul de lucru pe
care se gsete 'expression'. Spaiul de lucru WS poate fi 'caller' sau 'base'. Este
similar cu eval, cu excepia faptului c se menine controlul spaiului de lucru de
pe care se evalueaz expresia.
Un exemplu de apelare este [hm,hv,hmol]=evalin('caller','Haert(35)'), care
calculeaz aceleai mrimi ca i anterior.

Funcia builtin evalueaz numai funciile interne ale Matlab, fiind pentru
acestea asemntoare cu feval. Sintaxa de apelare este:
[y1,..,yn] = builtin(F,x1,...,xn)
n care x1,...,xn sunt argumentele de intrare pentru funcia F, dat sub form de
caractere, iar y1,..,yn sunt argumentele de ieire ale funciei F.
De exemplu,
builtin('sin',pi/3)
conduce la:
ans =
0.8660,
la fel ca i feval('sin',pi/3).

Funcia assignin(WS, name,V) atribuie variabilei name o valoare V n
Limbajul Matlab instruciuni i funcii de control specifice 85
spaiul de lucru WS, care poate fi 'caller' sau 'base'.
De exenplu, prin:
assignin('caller','b',15)
variabila b primete valoarea,
b =
15

Funcia run execut n mod normal un program Matlab, fr s fie explicit
chemat sub forma run nume_fiier, ci numai prin tastarea numelui fiierului i
apsarea tastei Enter. Pentru a se putea rula programul, acesta trebuie s se
gseasc n calea de lucru Matlab, fapt ce se poate obine, fie prin utilizarea
instruciunii addpath, care adaug directorul n calea de lucru, fie prin utilizarea
comenziicd care schimb directorul de lucru, acolo unde este nume_fiier.
5.3. Funcii i variabile specifice
Un fiier script este un fiier extern, avnd extensia m, care conine o
secven de comenzi Matlab, ca de exemplu nume_fiier.m. Din aceast cauz, mai
sunt denumite fiiere de tip M. Prin apelarea numelui fiierului, se execut secvea
Matlab coninut n acesta. Dup execuia complet a unui fiier script, variabilele
cu care acesta a operat rmn n zona de memorie a aplicaiei. Aceste fiiere nu
permit integrarea n programe mari, realizate pe principiul modularizrii. Fiierele
script sunt folosite pentru rezolvarea unor probleme care cer comenzi succesive
att de lungi, nct ar putea deveni greoaie pentru lucrul n mod interactiv, adic n
modul linie de comand.
Un exemplu de program script este cel pentru calculul randamentului pompei
de alimentare, care vehiculeaz un debit de ap:
d= 120; x=d.*3.6;
c=[-2.394344424806420e-013 1.204969248337818e-009 ...
-2.493067720884727e-006 2.359430867915677e-003 ...
-1.006032839331329e-002];
eta=c(1).*x.^4+c(2).*x.^3+c(3).*x.^2+c(4).*x+c(5);
end
n care: c constantele curbei debitului, d [kg/s] este debitul de ap vehiculat de
pompa de alimentare, iar eta randamentul pompei, care depinde de debit.

Fiierele funcie sunt un tip special de fiiere M, care conin n prima linie
cuvntul function, prin care fiierul respectiv este declarat ca fiier funcie. O
funcie difer de un script prin faptul c poate lucra cu argumente (de intrare
i/sau ieire). Variabilele definite i manipulate n interiorul unui fiier funcie sunt
localizate la nivelul acestuia. Prin urmare, la terminarea execuiei unei funcii, n
memoria calculatorului nu rmn dect variabilele de ieire ale acesteia.
Fiierele funcie sunt utilizate pentru extinderea Matlab-ului, adic pentru
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 86
crearea unor noi funcii Matlab. Forma general a primei linii a unui fiier funie
este:
function [param_ieire]=nume_funcie(param_intrare)
unde:
function cuvntul cheie obligatoriu care declar fiierul de tip funcie;
param_iesire parametrii de ieire care trebuie separai prin virgul i
cuprini ntre paranteze drepte, iar dac funcia nu are parametrii de ieire
atunci parantezele drepte i semnul egal nu mai au sens;
nume_funcie numele functiei, adica numele sub care se salveaz fiierul,
iar acesta nu trebuie s fie identic cu al unei funcii Matlab existente;
param_intrare parametrii de intrare care trebuie separai prin virgul i
nchii ntre paranteze rotunde, iar dac funcia nu are parametrii de intrare
aceste paranteze nu mai au sens.

Aceste fiiere pot fi adugate ca funcii noi n structura Matlab. Comenzile i
funciile care sunt utilizate de noua funcie sunt nregistrate ntr-un fiier cu
extensia *.m. Prima linie a fiierului trebuie s conin definiia sintactic a noii
funcii. De exemplu, fiierul de mai sus, care calculeaz randamentul pompei de
alimentare funcie de debit, se poate numi etapa.m, fiind de forma:
function eta=etapa(d)
% function eta=etapa(d)
% d [ kg/s ] - debit apa vehiculat de Pompa de alimentare PA
% eta [ - ] - randament Pompa de Alimentare PA
x=d.*3.6;
c=[-2.394344424806420e-013 1.204969248337818e-009 ...
-2.493067720884727e-006 2.359430867915677e-003 ...
-1.006032839331329e-002];
eta=c(1).*x.^4+c(2).*x.^3+c(3).*x.^2+c(4).*x+c(5);
end

Din exemplele anteriore, se observ i diferena dintre un fiier funcie i un
fiier script.

Dac considerm funcia existent, stat.m, care calculeaz deviaia statistic,
function [mean,stdev] = stat(x)
%STAT Interesting statistics.
n = length(x);
mean = sum(x) / n;
stdev = sqrt(sum((x - mean).^2)/n);
putem defini o nou funcie avg.m, care calculeaz media,
function mean = avg(x,n)
%MEAN subfunction
mean = sum(x)/n;
ce poate fi chemat n stat.m, aceasta devenind:
Limbajul Matlab instruciuni i funcii de control specifice 87
function [mean,stdev] = stat(x)
%STAT Interesting statistics.
n = length(x);
mean = avg(x,n);
stdev = sqrt(sum((x-avg(x,n)).^2)/n);
Prin urmare, o funcie poate fi chemat n interiorul altei funcii, ceea ce
permite o mare flexibilitate n rezolvarea unor probleme complexe.

Definirea unei variabile globale se face prin instruciunea global, care are
urmtoarea sintax:
global X Y Z,
n care variabilele Z, Y i Z sunt definite global.
n mod normal, fiecare funcie Matlab, definit printr-un fiier de tip m, are
variabile locale, care nu pot fi utilizate n alte funcii i care nu apar n spaiul de
lucru. Pentru ca mai multe funcii s lucreze cu aceeai valoare a unei variabile,
calculat ntr-o funcie sau din spaiul de lucru, aceasta este declarat de tip global.


Dac la momentul declarrii variabilei, aceasta nu are alocat o valoare,
atunci se iniializeaz pentru ea o matrice goal, n care urmeaz a se introduce
valoarea calculat la momentul apelrii funciei, n care i se aloc o valoare. Fr a
fi strict necesar, variabilele globale sunt de regul definite cu litere mari.

Verificarea faptului dac o variabil este de tip global se face prin
instruciunea isglobal, care are urmtoarea sintax:
isglobal(A)
care returneaz 1, dac A este declarat de tip global i 0, altfel.

n mod normal, dup chemarea unei funcii, variabilele locale sunt terse din
memorie. Prin comanda persistent X Y Z, se rein n memorie variabilele locale
X, Y i Z dintr-o funcie oarecare, dup ce aceasta a fost chemat. Variabilele
persistente sunt similare cu variabilele locale, cu deosebirea c acestea pot fi create
i schimbate numai n funcia n care au fost definite, prevenindu-se modificarea
lor n alte funcii Matlab, unde pot avea acelai nume (X, Y, Z). Numele
variabilelei persistente nu trebuie s fie acelai cu al unei variabile din spaiul de
lucru.
Variabilele persistente sunt terse din memorie, cnd fiierul de tip m este
modificat sau prin comanda mlock.

Comanda mlock previne tergerea fiierului de tip m din memorie, printr-o
comand clear.

Comanda mfilename, d numele fiierului de tip m executat n momentul
respectiv. Cnd comanda este executat ntr-un fiier, atunci la execuia acestuia,
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 88
prima dat se d i numele fiierului de tip m, sub care este salvat funcia.
De exemplu, funcia car, d cldurile specifice ale CaO solid,
function [cp,cpm]=cpcao(t)
% function [cp,cpm]=cpcao(t)
% Cldurile specifice masice i molare reale, a CaO solid
% funcie de temperatur, dup Hayhurst
% cp [ kJ/(kg.K) ] - cldura specific masic real la p=const.
% cpm [kJ/(kmol.K)] - cldura specific molar real la p=const.
% t [ grd. C ] - temperatura > 298 K si < 3020 K
% Mmol [ kg/kmol ] - masa molar CaO solid.
Mmol=56.8; tk=t+273.15; a=48.86; b=4.52e-3; c=-6.53e+5;
cpm=a+b.*tk+c./tk.^2; cp=cpm./Mmol; format
mfilename
apelat cu comanda,
[cp,cpm]=cpcao(50)
conduce la,
ans =
cpcao
cp =
0.7758
cpm =
44.0674

Dac schimbm numele fiierului m din cpcao.m n ,de exemplu, cap.m,
atunci putem apela funcia de mai sus cu,
cp,cpm]=cap(50)
care va avea ca rezultat:
ans =
cap
cp =
0.7758
cpm =
44.0674

Cnd comada mfilename este apelat singur, ca de exemplu,
mfilename
atunci va returna o matrice goal,
ans =
[]

Crearea unei liste de variabile, lists, separate prin virgul, dintr-o matrice de
tip celul sau structurarea unei liste se poate face:
prin comanda C{:} sau S.name ;
cu paranteze, n partea de chemare a funciei : myfun(x,y,C{:}) sau
Limbajul Matlab instruciuni i funcii de control specifice 89
myfun(x,y,S.name) ;
cu paranteze drepte, n partea de ieire, care produce o cocatenare
orizontal : [C{:}] sau [S.name]
cu paranteze drepte [C{:}] = myfun sau [S.name] = myfun ;
cu acolade n partea de construcie a celulei : {C{:}} sau {S.name}

n toate cazurile de mai sus, C{:} este la fel ca i C{1},C{2},...,C{end}, iar
S.name este la fel ca i S(1).name,S(2).name,...,S(end).name. Dac C sau S sunt o
matrice de 1-pe-1, atunci se produce sau extrage un singur element, iar pentru mai
multe elemente se utilizeaz : , ca de exemplu C{1:5} sau S(2:3).name.
De exemplu:
C = {1 2 3 4}
A = [C{:}]
B = cat(2,C{:})
[S(1,3,:).FIELD] = magic(4)
conduce la:
C =
[1] [2] [3] [4]
A =
1 2 3 4
B =
1 2 3 4
S =
1x3 struct array with fields:
FIELD
iar S.FIELD este,
ans =
[]
ans =
[]
ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

Verificarea existenei unei variabile sau funcii se execut prin comanda
exist, avnd structura,
exist('A')
la care se returneaz :
0 ,dac A nu exist ;
1, dac A este o variabil din spaiul de lucru ;
2, dac A este un fiier de tip m n directorul cutat sau A este numele
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 90
directorului ;
3, dac A este un fiier de tip mex n directorul n care se caut ;
4, dac A este un fiier de tip mdl n directorul n care se caut ;
5, dac A este o funcie intern a Matlab ;
6, dac A este un fiier de tip p n directorul n care se caut ;
7, dac A este un director ;
8 ,dac A este din clasa Java.

Instruciunea exist('A') sau exist('A.ext') returneaz 2, dac numele 'A' sau
'A.ext' i extensia este P sau MEX.
Prin exist('a', 'var'), caut numai variabila a n fiierul n care este comanda
sau n spaiul de lucru.
Instruciunea exist('A',builtin) caut numai funciile interne, iar cu
exist('A', 'file') se caut numai fiiere sau directoare.
Prin exist('A', 'dir') se caut numai existena directoarelor, iar cu exist('A',
'class') se verific existena fiierelor de tip Java.
Atunci cnd rezultatul cutrii este nul, se returneaz 0.

Prin instruciunea munlock('fun') se terge din memorie fiierul fun, de tip
m, avnd ca efect similar cu cel al comenzii clear, fr ns a-l terge permanent.

Comanda mislocked('fun') returneaz 1, dac numele 'fun' este n memorie
i 0, altfel.

Operatorii precedeni versiunii rulate momentan sunt identificai cu comanda
precedente, care, de regul, se refer numai la operatorii interni (built-in).
Operatorii interni, ordonai dup trie, n ordinea, de la cel mai puternic
(highest) spre cel mai slab (lowest), sunt:
1. transpunerea (.'), putere (.^), conjugatul complex, transpusa ('), matrice
la putere (^);
2. adunare matrice (+), scdere matrice (-), negaie logic (~);
3. multiplicare (.*), mprire la dreapta (./), mprire la stnga (.\),
multiplicare matrice (*), mprire la dreapta matrice (/), mprire la
stnga matrice (\);
4. adunare (+), scdere (-);
5. operatorul a dou puncte sau colon (:);
6. mai mic (<), mai mic sau egal (<=), mai mare (>), mai mare sau egal, cu
(>=), egal (==), nu este egal (~=);
7. operatorul logic i - and (&);
8. operatorul logic sau - or (|)

Pentru a vedea dac numele unei variabile este valid n Matlab, se utilizeaz
Limbajul Matlab instruciuni i funcii de control specifice 91
instruciunea,
Isvarname(S)
unde S, este numele variabilei. De menionat c numele unei variabile Matlab
trebuie sa nceap cu o liter i poate avea pn la 31 de semne diferite (litere i/sau
numele), separate cel mult prin liniu jos (underscore).
5.4. Argumente de intrare
Verificarea dac numrul argumentelor de intrare ale unei funcii este corect
ales la apelare, se face cu instruciunea:
MSG = nargchk(low,high,N),
care returneaz un mesaj de eroare, dac N-, numrul de argumente de intrare nu
este cuprins ntre low i high. Dac numrul de argumente se ncadreaz n
domeniul respectiv, se returneaz o matrice vid.

Pentru testarea numrului argumentelor de intrare, ce trebuie introduse pentru
apelarea unei funcii, este disponibil variabila permanent nargin, care se
apeleaz cu sintaxa:
nargin(fun),
unde fun, este numele funciei creia i se caut numrul de argumente. Se returnez
numrul variabilelor de intrare, iar dac funcia nu are intrri, se returneaz un
numr negativ.
Pentru hfpt(p,t), avnd 2 argumente, se obine:
nargin('tfph')
ans =
2

Pentru testarea numrului argumentelor de ieire, ce pot fi introduse pentru
apelarea unei funcii, este disponibil variabila permanent nargout, care se
apeleaz cu sintaxa:
nargout(fun),
unde fun, este numele funciei creia i se caut numrul de argumente de ieire. Se
returnez numrul variabilelor de ieire, iar dac funcia nu are ieiri, se returneaz
un numr negativ.
Pentru hfpt(p,t), avnd un argument, se obine:
nargout('tfph')
ans =
1.
Lista variabilelor de intrare este dat prin variabila varargin, care poate
avea orice numr de argumente de intrare ale funciei. Variabila varargin este o
matrice, ce conine argumentele opionale ale funciei. Ea trebuie declarat ultim
argument de intrare (scris numai cu litere mici) i colecteaz toate argumentele de
intrare,
function myplot(x,varargin)
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 92
plot(x,varargin{:})
La apelarea prin comanda,
myplot(sin(0:.1:1),'color',[.5 .7 .3],'linestyle',':')
rezult o matrice de 1 x 4 care conine valorile: 'color', [.5 .7 .3], 'linestyle', and ':'.
Lista variabilelor de ieire este dat prin variabila varargout, care poate
avea orice numr de argumente de ieire ale funciei. Variabila varargout este o
matrice ce conine argumentele opionale ale funciei. Ea trebuie declarat ultim
argument de ieire (scris numai cu litere mici) i colecteaz toate argumentele de
ieire. De exemplu, funcia,
function [s,varargout] = mysize(x)
nout = max(nargout,1)-1;
s = size(x);
for i=1:nout, varargout(i) = {s(i)}; end

returneaz dimensiunea vectorului argumentelor, respectiv:
[s,rows,cols] = mysize(rand(4,5));

returneaz,
s = [4 5], rows = 4, cols = 5.
Numele argumentului (variabilei) de intrare este memorat n variabila
inpuitname. Dac considerm funcia,
function y = myfun(a,b)
disp(sprintf('My first input is "%s".' ,inputname(1)))
disp(sprintf('My second input is "%s".',inputname(2)))
y = a+b;
then
x = 5; myfun(x,5)
aceasta produce,
My first input is "x".
My second input is "".
Dac nu exist nici un nume al variabilei de intrare, ca la apelrile:
a(1), varargin{:}, eval(expr) etc.,
atunci se returneaz o matrice goal.
5.5. Mesaje pe display
Afiarea unor mesaje, la ntlnirea unei erori, se face prin instruciunea
error, care se apeleaz cu sintaxa: error( 'MSG').
Dup afiarea textului 'MSG', controlul este redat tastaturii. Cele mai
frecvente mesaje sunt: <component>[:<component>]:<mnemonic>, unde
<component> i <mnemonic> sunt alfanumerice.
De exemplu, pentru a verifica c o funcie (aici numit test) este apelat
corect, ca numr de argumente de intrare (aici 2), se procedeaz astfel:
Limbajul Matlab instruciuni i funcii de control specifice 93
function test(x,y)
if nargin ~=2
error('Numrul argumentelor de intrare greit')
end.
Afiarea unui mesaj de avertizare, care nu ntrerupe execuia programului,
se face cu instruciunea warning('MSG'), care permite afiarea pe ecran a
mesajului de avertizare MSG, care poate fi 'MATLAB:divideByZero'.
Prin comanda warning off se suprim afiarea oricrui mesaj, iar prin
comanda warning on, se afieaz toate mesajele de avertizare. Comanda warning
backtrace este la fel ca i comanda warning on, cu deosebirea c fiierul
numeroteaz liniile de mesaje de avertizare. Prin instruciunea warning debug se
pornete depanatorul i are ca efect stoparea programului, ca i instruciunea
dbstop if warning, oprind rularea la ntlnirea unei erori.
Prin comanda warning once, se prezint pe ecran orice informaie
referitoare la graficele din sesiunea de lucru. Prin comanda warning always, se
dau mesaje privind compatibilitatea graficelor executate. La executarea comenzii
warning debug, se activeaz debuger-ul, similar ca i la comanda dbstop if
warning.
Pentru setarea argumentului de stare, ARG, la una din strile on, off,
backtrace sau debug i rentoarcerea strii n mrimea de ieire, S, se utilizeaz
comanda,
S=warning(ARG),
iar pentru a marca mesajul de atenionare cel mai frecvent, se utilizeaz comanda,
[S,F]= warning(ARG),
unde ,n F, este reinut mesajul cel mai frecvent.
Afiarea pe ecran a ultimului mesaj de eroare ntlnit se face prin comanda
lasterr. Dac nu a fost ntlnit nici o eroare, se afieaz o matrice vid,
ans =
''
iar la intlnirea unei erori, de exemplu mrimea c este nedefint, se afieaz:
ans =
Undefined function or variable 'c'.
Pentru afiarea pe ecran a ultimului mesaj de avertizare, se utilizeaz
comanda lastwarn, care returneaz o matrice vid, dac nu s-a ntlnit nici un
mesaj de avertizare,
ans =
''
sau coninnd mesajul de averizare,
Warning: File:C:\MATLABR12\work\bunem\CPCAO.M Line: 13 Column: 1
Unmatched "end".
Afiarea pe ecran a unei informaii coninute ntr-o matrice X, se face cu
comanda disp('X'), astfel :
disp(' Presiunea absolut a aburului viu, pab [ bar ]')
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 94
care are ca efect afiarea pe ecran :
Presiunea absolut a aburului viu, pab [ bar ]
Pentru a afia pe ecran o matrice, se utilizeaz comanda display. Pentru
obiectul X, funcia este chemat cu display, apeleaz funcia disp, ca n exemplu,
X = inline('sin(x)')
pentru care se obine,
X =
Inline function:
X(x) = sin(x)
n mod normal, funcia display(X) apeleaz funcia disp, n cadrul unor
bucle, precum,
function display(X)
if isequal(get(0,'FormatSpacing'),'compact')
disp([inputname(1) ' =']);
disp(X)
else
disp(' ')
disp([inputname(1) ' =']);
disp(' ');
disp(X)
end
Scrierea datelor n format se face cu instruciunea fprintf, care are structura,
COUNT = printf(FID,FORMAT,A,...)
unde:
COUNT este numrul de bii scrii succesiv, care de cele mai multe ori
lipsete;
FID este un un numr ntreg, asociat pentru identificarea fiierului n care se
scrie, care poate fi ieirea standard, respectiv ecranul, cnd FID=1 sau este
omis, sau 2 pentru erorile standard;
FORMAT, este formatul de scriere ;
A, este matricea care trebuie scris.
Identificatorul FID al fiierului ,se obine prin funcia fopen.
Formatul de scriere este un caracter specific limbajului C, precedat de
caracterul %, ce arat nceputul conversiei specificate, astfel nct, s poat fi
scrise datele din matricea A. Principalele formate de scriere sunt d, i, o, u, x, X, f,
e, E, g, G, c i s.
Conversia datelor controleaz notaia, alinierea, semnele (digii)
semnificative, mrimea cmpului i alte aspecte ale formatului de scriere. Acest
format poate conine i caractere speciale neprintabile, precum \n,\r,\t,\b,\f, \\, care
produc o linie nou, rentoarcerea cursorului la cap de rnd (carriage return), tab
orizontal, backspace, form liber i beckslash.
Prin urmare, conversia ncepe ntotdeauna cu caracterul % i conine
Limbajul Matlab instruciuni i funcii de control specifice 95
urmtoarele elemente opionale sau obligatorii,
semne, opionale, care controleaz alinierea, respectiv :
caracterul -, care poziioneaz datele la stnga i justificat, iar dac
lipsete poziionarea, se face la dreapta;
caracterul +, care scrie ntotdeauna semnul datei (plus,+, sau minus,-);
caracterul 0, care scrie n spaiile libere zero (0);
mrimea i precizia cmpului,opional, precum :
mrimea cmpului n digii, ca de exemplu 6 (prin %6f);
precizia, prin precizarea numrului de digii aflai dup punctual
zecimal, ca de exemplu 3 (prin %6.3f);
formatul de conversie obligatoriu, care poate fi :
semnul c, pentru un singur caracter;
semnul d, pentru notaia zecimal;
semnul e, pentru scrierea sub forma lui exponenial, cu litera e mic;
semnul E, pentru scrierea sub form exponenial, cu litera E mare;
semnul f, pentru notaia cu punct zecimal sau virgul fix;
semnul g, o form mai compact dect formatele e sau f,
nescriind zerourile nesemnificative;
semnul G, asemntor cu g, dar utiliznd notaia G;
semnul o, pentru date n baza opt (octagonal);
semnul s pentru caractere;
semnul u, pentru date n baza decimal;
semnul x, pentru date hexazecimale, utiliznd litere a-f;
semnul X, pentru date hexazecimale, utiliznd litere A-F;
subtipul de format de scriere, opional, utilizat n special pentru date n
dubl precizie i baza octogonal, zecimal sau hexagonal, ca de exemplu,
punnd caracterul b, naintea caracterului x ('%bx').

Formatul fprintf este vectorizat pentru cazul n care datele nu sunt scalare,
fiind repetat de cte ori e necesar.
De exemplu, setul de instruciuni,
x = 0:.1:1; y = [x; exp(x)];
fid = fopen('exp.txt','w'); fprintf(fid,'%6.2f 12.8f\n',y); fclose(fid);
create de fiierul text, numit exp.txt, coninnd un scurt tabel al funciei
exponeniale,
0.00 1.00000000
0.10 1.10517092
0.20 1.22140276
0.30 1.34985881
0.40 1.49182470
0.50 1.64872127
0.60 1.82211880
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 96
0.70 2.01375271
0.80 2.22554093
0.90 2.45960311
1.00 2.71828183

Comanda,
fprintf('A unit circle has circumference %g.\n',2*pi)
afieaz pe ecran,
A unit circle has circumference 6.28319.
Pentru a introduce un apostrof, ca semn ntre caractere, se utilizeaz de dou
ori apostroful, ca, de exemplu, fprintf(1,'Its Friday.\n'), care scrie It's Friday.
Prin setul de comenzi:
B = [8.8 7.7; 8800 7700];
fprintf(1,'X este %4.2f metri sau %8.3f mm\n',9.9,9900,B);
se obine,
X este 9.90 metri sau 9900.000 mm
X este 8.80 metri sau 8800.000 mm
X este 7.70 metri sau 7700.000 mm.
Conversia unor date ,n 32 bii, n date hexazecimale, se face astfel:
a = [6 10 14 44];
fprintf('%9X\n',a + (a<0)2^32)
rezultnd,
6
A
E
2C.
Scrierea datelor formatate dintr-o matrice A, n variabila Matlab S, utiliznd
un anume FORMAT, ca cel specificat anterior, se realizeaz cu funcia sprintf
apelat,
[S,ERRMSG] = sprintf(FORMAT,A,...)
n care, ERRMSG este un mesaj de eroare, ntlnit la conversie sau dac matricea
A e vid.

Funcia sprintf este asemntoare funciei fprintf, cu deosebirea c
returneaz datele n format Matlab.
De exemplu,
sprintf('%0.5g',(1+sqrt(5))/2) conduce la 1.618
sprintf('%0.5g',1/eps) conduce la 4.5036e+15
sprintf('%15.5f',1/eps) conduce la 4503599627370496.00000
sprintf('%d',round(pi)) conduce la 3
sprintf('%s','hello') conduce la hello
sprintf('The array is %dx%d.',2,3) conduce la The array is 2x3.
sprintf('\n') este linie de terminare a caracterelor.
Limbajul Matlab instruciuni i funcii de control specifice 97
5.6. Intrri (inputuri) interactive
Introducerea datelor de la tastatur se realizeaz prin instruciunea input,
care d comanda utilizatorului, ca de exemplu:
n=input('introducei numrul proiectului, n= ')
care conduce la afiarea pe ecran a mesajului,
introducei numrul proiectului, n=
dup care, Matlab ateapt introducerea numrului n, iar dac se introduce 1 i se
execut Enter, atunci se rspunde prin,
n=1.

Prin comanda input, se poate aloca o anumit valoare, introdus de la
tastatur, unei variabile, aici sim, prin comanda: sim=input('puterea
transformatorului este:').
Pentru valori alfanumerice, variabile de tip caracter, comanda este de forma:
input('Comentariu ','s'). Semnul s poate conine unul sau mai multe semne '\n',
ceea ce indic saltul la urmtoarea linie.

Chemarea tastaturii ntr-un fiier de tip M, se realizeaz prin comanda
keyboard, care trece controlul acesteia, iar revenirea la programul respectriv se
face dup introducerea datei cerute (sau nu), dar oligatoriu prin executarea
comenzii RETURN. Funcia este util n depanarea unor programe.
Funcia pause conduce la ateptarea unui rspuns din partea utilizatorului.
Apelat sub forma pause(n), se face o pauz de n secunde (poate fi i numr
fracional de forma lui k*0.01), pn la urmtoarea instruciune.
Comanda pause off dezactiveaz orice alt comand pause sau pause(n),
pn la ntlnirea, eventual, a comenzii pause on.
Crearea meniurilor pentru interfee grafice se realizeaz cu funcia uimenu,
iar crearea elementelor de control pentru interfee grafice se execut prin comanda
uicontrol. O explicitare a acestor comenzi este redat n capitolul de grafic.
5.7. Tipuri de date
5.7.1. Conversii de date
Setarea indicatorului ir de caractere se obine cu funcia setstr, care
returneaz caracterul corespunztor lui n din setstr(n), n fiind in intervalul 32127,
pentru precizie simpl i 0255, pentru precizie dubl.
Detectarea irurilor de caractere se realizeaz cu funcia isstr, care lucreaz
logic.

Formarea matricei ir de caractere, din iruri individuale, se execut cu
funcia str2mat, apelat cu sintaxa
S=str2mat(s1,s2,...)
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 98
rezultnd numrul de linii ale matricei S, egal cu numrul irurilor individuale,
s1,s2,..., iar numrul de coloane este egal cu dimensiunea celui mai mare ir
component.

Introducerea unui numr de spaii, n, se realizeaz cu funcia blanks(n), iar
eliminarea spaiilor goale din irul S, cu funcia deblank(S).

Crearea unui ir de caractere se realizeaz prin instruciunea char, care se
poate apela:
S = char(X), transform irul X, ce conine elemente ntregi, pozitive, ntr-
un ir de caractere, n intervalul 0-65535, iar prin double, transformm
irul de caractere n numeric ;
S = char(C), unde C, este o parte a irului; plaseaz fiecare element al lui
C, ntr-o coloan a irului de caractere S, iar pentru a transforma napoi, se
utilizeaz cellstr ;
S = char(t1,t2,t3,..), formeaz caracterele irului S, ce conine textele
t1,t2,t3,pe coloan, iar fiecare parametru al textului, ti, poate fi nsi un
ir de caractere.

Pentru a afia pe monitor irul de caractere ASCII, de la 3 la 32, se utilizeaz
comanda,
ascii = char(reshape(32:127,32,3)'),
rezultnd,
ascii =
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _
' a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
Conversia literelor mici dintr-un ir de caractere, s, n litere mari, S, se
realizeaz cu S=upper(s).
Conversia literelor mari dintr-un ir, S, n litere mici, s, se execut cu
s=lower(S).
Verificarea dac, ntr-un ir de caractere, S, sunt literele alfabetului, se face
cu F=isletter(S), care lucreaz logic, ntorcnd 1, pentru adevrat i 0, pentru fals.
Compararea a dou iruri de caractere se realizeaz cu funcia strcmp,
apelat,
F=strcmp(S1,S2)
care compar irul S1 cu irul S2 i returneaz F=1, dac este adevrat i F=0, dac
este fals. Funcia lucreaz n modul senzitiv, incluznd n comparaie, spaiile
dintre caractere i tipul caracterelor, mari sau mici, folosite la scriere.

Cutarea unui ir de caractere, S2, ntr-un alt ir de caractere, S1, se
realizeaz cu,
M=findstr(S1,S2)
rezultnd poziia M, de la care ncepe irul S2 n irul S1.
Limbajul Matlab instruciuni i funcii de control specifice 99

Conversia unui numr, X, ntr-un ir de caractere, S, se obine cu
S=num2str(X), iar funcia invers este X=str2num(S).

Conversia unui ntreg, I, ntr-un ir de caractere, S, se realizeaz prin
S=int2str(I).

Conversia numerelor zecimale ntregi, n, la numere hexazecimale, h, se
face prin h=dec2hex(n), iar trecerea invers se execut cu funcia n=hex2dec('h').

Transformarea datelor n dubl precizie se realizeaz cu instruciunea
double(x), care determin o valoare n dubl precizie pentru x. Dac x este deja un
ir n dubl precizie, instruciunea double nu mai are efect. Double este chemat
de expresii de forma for, if i while loops, dac expresia nu este deja de precizie
dubl.
Transformarea n precizie simpl se realizeaz cu funcia single,
B = single(A)
transform matricea A n precizie simpl, returnnd valorile n B. Matricea A poate
fi de orice form numeric (chiar i precizie dubl). Dac A este deja de precizie
simpl, single nu are efect. Precizia simpl necesit un spaiu de stocare mai mic
dect precizia dubl, dar are o precizie slab.
Transformarea unui vector, X, ntr-un ntre, fr semn se face cu funciile,
uint8, uint16, uint32. Dac X este deja un numr ntreg far semn, din aceeai
clas, uint... nu are nici un efect.
Apelate, i=uint..., acestea acioneaz astfel:
uint8 utilizeaz 1 byt pe element, pentru ntregi ntre 0 i 255 ;
uint16 utilizeaz 2 byi pe element, pentru ntregi de la 0 la 65 535 ;
uint32 utilizeaz 4 byi pe element, pentru ntregi ntre 0 i 4 294 967 295.

Transformarea unui vector, X, ntr-un ntreg cu semn se face cu funciile,
int8, int16, int32. Dac X este deja un numr ntreg cu semn, din aceeai clas,
int... nu are nici un efect.
Apelate, i=int..., acestea acioneaz astfel:
int8 utilizeaz 1 byt pe element, pentru ntregi ntre -128 i 128 ;
int16 utilizeaz 2 byi pe element, pentru ntregi de la -32 768 la 32 767 ;
int32 utilizeaz 4 byi pe element, pentru ntregi ntre -2147483648 i
21474836470.

Scrierea datelor dintr-o matrice sau vector A, ntr-un format dorit, se face cu
funcia sprintf, care se apeleaz cu sintaxa: S=sprintf('format',A).
Parametrul de control, irul 'format', conine specificaia de conversie i poate
fi de forma,
% -d.p tip_format
n care,
semnul - este opional i specific alinierea la stnga, iar dac lipsete,
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 100
alinierea se face la dreapta;
d este numrul minim de cifre (cmpuri) aferente datei respective;
p este numrul de cmpuri folosite pentru partea zecimal;
tip_format poate fi unul din caracterele:
e notaie exponenial ; f - notaie n virgul fix ;
g - formatele scurte ale lui e sau f, fr zerourile nesemnificative ;
\n - linie nou ; \t - tab orizontal ; \b - backspace ;
\r - carriage return (de la cap de rnd) ;
\f - form feed ; \\ backslash ; \ - apostrof.
5.7.2. Construirea unui obiect n linia de comand
Construirea unui obiect n linie, se realizeaz cu funcia inline, care se poate
apela cu una dintre sintaxele:
inline(expr), construiete o funcie de tip obiecte pentru Matlab, coninnd
expresia expr, iar argumentul de intrare al funciei astfel construite este
determinat automat din expresia, expr, care se compar cu expresiile
Matlab valide, iar dac nu exist nici un caracter, se utilizeaz variabila x ;
inline(expr,arg1,arg2, ...), construiete o funcie care are argumentele de
intrare specificate de arg1, arg2,.... i, n acest caz, pot fi utilizate i
multicaractere ;
inline(expr,n), construiete o funcie cu n argumente, de n variabile.

Funcia inline este realizat practic de trei comenzi, care i determin modul
n care este creat,
char(fun), transform funcia linie, ntr-un ir de caractere, care sunt
identificate de formula fun;
argnames(fun), returneaz numele argumentelor de intrare ale liniei de
obiecte fun, din irul de celule;
formula(fun), returneaz formula pentru obiectul fun.
De exemplu comanda g = inline('t^2') conduce la:
g =
Inline function:
g(t) = t^2
comanda g = inline('sin(2*pi*f + theta)') conduce la,
g =
Inline function:
g(f,theta) = sin(2*pi*f + theta)
comanda g = inline('sin(2*pi*f + theta)', 'f', 'theta') conduce la,
g =
Inline function:
g(f,theta) = sin(2*pi*f + theta)
iar comanda g = inline('x^P1', 1) conduce la,
Limbajul Matlab instruciuni i funcii de control specifice 101
g =
Inline function:
g(x,P1) = x^P1
5.7.3. Funcii specifice irului de celule i structurilor
Crearea unui ir de celule se realizeaz prin cell, care se apeleaz cu una
dintre sintaxele:
c = cell(n), creeaz un ir de celule de forma n x n, afind un mesaj de
eroare, dac n nu este ntreg ;
c = cell(m,n) sau c = cell([m,n]), determin un ir m-n al matricei goale, iar
argumentele m i n trebuie s fie scalare ;
c = cell(m,n,p,...) sau c = cell([m n p ...]), creeaz un ir de celule m-n-p-
al matricei goale, dar argumentele m,n,p, trebuie s fie scalare ;
c = cell(size(A)), determin un ir de celule de dimensiunea lui A,
coninnd toate matrice goale ;
c = cell(javaobj), transform irul Java sau obiectele Java, javaobj, ntr-un
ir de celule n Matlab, iar elementele rezultate din irul de celule vor putea
fi recunoscute de Matlab.

De exemplu, pentru a crea un ir de celule care are aceeai dimensiune ca a
irului A, se utilizeaz secvena,
A = ones(2,2); c = cell(size(A)),
Rezultnd:
c =
[] []
[] []
Urmtorul exemplu transform un ir din obiecte al java.lang.String ntr-un
ir de celule din Matlab,
strArray = java_array('java.lang.String',3);
strArray(1) = java.lang.String('one'); strArray(2) = java.lang.String('two');
strArray(3) = java.lang.String('three'); cellArray = cell(strArray)
rezultnd:
cellArray =
'one'
'two'
'three'

Aplicarea unei funcii fiecrui element dintr-un ir se realizeaz cu cellfun,
apelat:
D = cellfun('fname',C), aplicat elementelor din irul C, al funciei fname,
determin un rezultat D, care este un ir dublu, n sensul c, fiecare
element din D conine valoarea returnat de fname, prin corespondena cu
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 102
irul C, iar D are aceeai dimensiune cu C ;
D = cellfun('size',C,k), determin dimensiunea fiecrui element, k, din C ;
D = cellfun('isclass',C,'classname'), determin adevarat pentru fiecare
element din C, care aparine unei clase i fals, pentru obiectele ce aparin
unei subclase.

Funcia 'fname'poate fi:
'isreal' - verific dac elementele celulei sunt reale;
'isempty' - verific dac elementele celulei sunt goale;
'islogical' - verific dac elementele celulei sunt elemente logice;
'length' - determin lungimea celulei;
'ndims' -determin numrul de dimensiuni ale celulei;
'prodofsize'-determin numrul de elemente din celul.

De exemplu, considerm irul de celule de forma 2-3, format prin setul de
instruciuni,
C{1,1} = [1 2; 4 5]; C{1,2} = 'Name'; C{1,3} = pi; C{2,1} = 2 + 4i;
C{2,2} = 7; C{2,3} = magic(3);
rezultnd celula C =
[2x2 double] 'Name' [ 3.1416]
[2.0000+ 4.0000i] [ 7] [3x3 double].
Verificarea, dac elementele sunt reale, se realizeaz cu D =
cellfun('isreal',C), rezultnd,
D = [ 1 1 1
0 1 1 ].
Lungimea elementelor celulei rezult cu len = cellfun('length',C), obinnd:
len = [ 2 4 1
1 1 3 ].
Determinarea elementelor duble ale celulei se realizeaz cu,
isdbl = cellfun('isclass',C,'double'),
rezultnd,
isdbl = [ 1 0 1
1 1 1 ].

Afiarea elementelor celulei se realizeaz cu funcia celldisp, care, aplicat
celulei C, de mai sus, este celldisp(C) i conduce la,
C{1,1} = [ 1 2 ; 4 5 ];
C{2,1} = [ 2.0000 + 4.0000i ];
C{1,2} = [ Name ];
C{2,2} = [ 7 ];
C{1,3} = [ 3.1416 ];
C{2,3} = [ 8 1 6 ; 3 5 7 ; 4 9 2 ].

Limbajul Matlab instruciuni i funcii de control specifice 103
Afiarea sau plotarea elementelor unei celule se execut cu comanda
cellplot, care se poate apela:
cellplot(c), afieaz o fereastr cu un grafic, reprezentat de coninutul lui
c, elementele fiind reprezentate de vectori i iruri de valori scalare i texte
scurte ;
cellplot(c,'legend') afieaz n plus, o legend, avnd culori diferite pentru
date de la double, char, sparse, structure i altele.

Transformarea unui ir de celule al unei matrice, ntr-o matrice simpl, se
realizeaz cu cell2mat, care se poate apela cu m = cell2mat(c).
Dac,
C = {[1] [2 3 4]; [5; 9] [6 7 8; 10 11 12]}
adic,
C = [ 1] [1x3 double]
[2x1 double] [2x3 double]
prin,
M = cell2mat(C)
rezult,
M =
1 2 3 4
5 6 7 8
9 10 11 12.

Transformarea unei matrice obinuite, ntr-o matrice de celule, se realizeaz
cu comanda mat2cell, care se poate apela,
c = mat2cell(x,m,n)
i mparte n mai multe pri cele dou dimensiuni ale matricei x, returnnd irul de
celule, c, iar vectorii m i n specific numarul de linii i coloane.
Dac,
x=[1 2 3 4; 5 6 7 8; 9 10 11 12]
cu comanda,
c=mat2cell(x,[1 2],[2 2])
se obine,
c=
[1x2 double] [1x2 double]
[2x2 double] [2x2 double].

Transformarea unui ir numeric ntr-un ir de celule se realizeaz cu funcia
num2cell, care se poate apela,
C = num2cell(A), transform matricea A ntr-un ir de celule, plasnd
fiecare element din A ntr-o celul separat, iar irul de celule, C, va avea
aceeai dimensiune cu matricea A ;
C = num2cell(A,dims), transform matricea A ntr-un ir de celule, plasnd
SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 104
dimensiunile specificate de dims, ntr-o celul separat, iar C are aceeai
dimensiune cu A, exceptnd cazul cnd dimensiunea este 1.

Dac A=[1 2 3; 4 5 6; 7 8 9], prin C=num2cell(A) se obine:
C =
[1] [2] [3]
[4] [5] [6]
[7] [8] [9]

Administrarea intrrilor i ieirilor se realizeaz cu funcia deal, care se
apeleaz,
[Y1,Y2,Y3,...] = deal(X) copiaz intrrile unice n ieiri, fiind acelai lucru
ca i Y1 = X, Y2 = X, Y3 = X, ... ;
[Y1,Y2,Y3,...] = deal(X1,X2,X3,...) este acelai lucru ca i Y1 = X1; Y2 =
X2; Y3 = X3;

Pentru exemplificare, se prezint utilizarea funciei deal pentru a copia
coninutul irului de celule, C, n patru variabile separate de ieire, a,b,c,d, astfel:
C = {rand(3) ones(3,1) eye(3) zeros(3,1)}; [a,b,c,d] = deal(C{:}).

Realizarea unei structuri se execut cu funcia struct, apelat cu una dintre
sintaxele:
s = struct('field1',{},'field2',{},...) determin o structur goal, cu
cmpurile field1, field2, ... ;
s = struct('field1',values1,'field2',values2,...) determin o structur ir, cu
specificarea cmpurilor i a valorilor, cu observaia c valorile values1,
values2 etc. trebuie s fie un ir de celul de aceeai dimensiune sau celule
scalare, iar elementele corespunztoare irurilor de valori sunt plasate ntr-o
structur corespunztoare de elemente ir, cu dimensiunea rezultatului ca i
cea a valorilor irului de celule.

De exemplu, comanda
s = struct('type',{'big','little'},'color',{'red'},'x',{3 4})
determin o structur de ir s,
s =
1x2 struct array with fields:
type
color
x
n care,
s(1) =
type: 'big'
color: 'red'
x: 3
Limbajul Matlab instruciuni i funcii de control specifice 105
s(2) =
type: 'little'
color: 'red'
x: 4

Transformarea unui ir de celule ntr-o structur de tip ir, care s conin
informaia din celule, se realizeaz cu funcia cell2struct, apelat:
s = cell2struct(c,fields,dim)
n care, argumentele cmpurilor specific numele cmpului din structura irului, c,
astfel c fields poate fi un ir de celule, iar dim controleaz care valoare a irului de
celule este folosit n crearea structurii irului. Lungimea lui c este specificat de
numrul cmpurilor de nume fields; cu alte cuvinte, urmtoarele relaii trebuie s
fie adevrate:
size(c,dim) == length(fields) % dac cmpul este un ir de celule;
size(c,dim) == size(fields,1) % dac cmpul este un ir (vector);

Dac un ir de celule, c, conine informaii, (de exemplu cele trei coloane
indic numele, genul, greutatea)
c = {'birch','betula',65; 'maple','acer',50}
c =
'birch' 'betula' [65]
'maple' 'acer' [50]
pentru a pune aceste informaii ntr-o structur denumit 'nume', 'gen', 'greutate', se
folosete funcia cell2struct,
fields = {'nume', 'gen', 'greutate'};
s = cell2struct(c, fields, 2);
rezultnd:
s(1)= s(2)=
nume: 'birch' nume: 'maple'
gen: 'betula' gen: 'acer'
greutate: 65 greutate: 50

Vizualizarea structurii irului transformat se realizeaz cu funcia struct2cell,
apelat,
c = struct2cell(s)
care transform o structur s, de forma m x n (cu p cmpuri), ntr-o structur de
forma p x m, pe c iruri de celule c, iar dac structura lui s este multidimensional,
irul de celule c are dimensiunea [p size(s)].
Apelat pentru exemplul anterior, c=struct2cell(s), rezult,
c=
'birch' 'maple'
'betula' 'acer'
[ 65] [ 50]

SISTEME DE PROGRAMARE PENTRU MODELARE I SIMULARE 106
Verificarea dac un vector sau ir oarecare este un ir de celule se realizeaz
cu funcia iscell, astfel:
tf = iscell(A)
care returneaz un rspuns logic true (sau 1), dac A este un ir de celule i false
(sau 0), dac nu este.

Pentru a crea un ir de obiecte Java, se utilizeaz funcia Matlab
javaArray, care are urmtoarea sintax:
A = javaArray('element_class', m, n, p, ...)
n care primul argument, element_class, este numele elementelor din ir, iar
argumentele (m,n,p,) sunt elementele fiecrei dimensiuni din ir.
Un ir care a fost creat cu javaArray este echivalent cu irul creat de codul
Java. Funcia javaArray nu memoreaz orice ir, ntr-un grup de elemente create, ci
acest lucru se face separat.
5.7.4. Funcii specifice irului multidimensional
Determinarea numrului de dimensiuni ale irului A se realizeaz cu
funcia n=ndims(A), rezultnd numrul n. Numrul dimensiunilor dintr-un ir este
mereu mai mare sau egal cu 2. Dimensiunea lui A este determinat pentru fiecare
mrime prin size(A,dim) = 1, iar n general ndims(x) este length(size(x)).

Concatenarea irurilor se realizeaz cu funcia cat, care se apeleaz:
C = cat(dim,A,B) concateneaz sirurile A i B ;
C = cat(dim,A1,A2,A3,A4,...) concateneaz intrrile irurilor
(A1,A2,A3,A4) ;
C= cat(2,A,B) este acelai lucru ca i [A,B], iar cat(1,A,B) este acelai
lucru ca i [A;B].

Sintaxa cat(dim,C{:}) sau cat(dim,C.field) este modul de a concatena celula
sau structura irului ce conine matrice numerice, ntr-o singur matrice.

Generarea unui ir multidimensional, pentru realizarea unei reele (grid), se
realizeaz cu funcia ngrid, care se apeleaz,
[X1,X2,X3,...] = ndgrid(x1,x2,x3,...), transform domeniul specificat de
vectorii x1,x2,x3, n irul X1,X2,X3, care poate fi folosit pentru a
evalua funciile cu mai muli parametri i interpolri multiple ;
[X1,X2,...] = ndgrid(x) este acelai lucru ca i [X1,X2,...] = ndgrid(x,x,...).

Funcia ndgrid este asemntoare cu meshgrid, exceptnd faptul c ordinea
celor dou intrri este schimbat. Astfel, [X1,X2,X3] = ndgrid(x1,x2,x3) produce
acelai rezultat ca i [X2,X1,X3] = meshgrid(x2,x1,x3).

Permutarea dimensiunilor unui ir multidimensional se realizeaz cu funcia
permute apelat,
Limbajul Matlab instruciuni i funcii de control specifice 107
B = permute(A,order)
rearanjeaz dimensiunile lui A, care sunt specificate vector; B are aceleai valori ca
i A, dar ordinea este rearanjat, iar toate elementele din order trebuie s fie unice.

Inversarea permutrii realizate se execut cu funcia ipermute apelat,
A = ipermute(B,order)
care rearanjeaz dimensiunea lui B, deci permute(A,order) va produce B, care are
aceleai valori ca i A, dar ordinea elementelor este schimbat. Toate elementele
din order trebuie s fie unice.
Funciile permute i ipermute sunt utile pentru iruri multidimensionale.

Schimbarea dimensiunilor unui ir se realizeaz cu funcia shiftdim, care se
poate apela:
B = shiftdim(X,n) schimb dimensiunea lui X ; cnd n este pozitiv,
schimb dimensiunea la stnga, iar cnd n este negativ, schimb
dimensiunea ctre dreapta ;
[B,nshifts] = shiftdim(X) determin irul B, cu acelai numr de elemente
ca i X, iar dac X este scalar, shiftdim nu are efect.

Comanda shiftdim este asemntoare comenzilor sum sau diff, care sunt
aplicate pentru monodimensiuni.
Pentru exemplificare, se recomand secvena,
a = rand(1,1,3,1,2);
[b,n] = shiftdim(a); % b este 3-pe-1-pe-2 i n este 2.
c = shiftdim(b,-n); % c == a.
d = shiftdim(a,3); % d este 1-pe-2-pe-1-pe-1-pe-3.

nlturarea monodimensiunilor unui ir se realizeaz cu funcia squeeze,
care se apeleaz,
B = squeeze(A)
ce returneaz un ir B cu aceleai elemente ca i A, dar cu o singur
monodimensiune, size(A,dim) = 1.

S-ar putea să vă placă și