Sunteți pe pagina 1din 10

Programare si limbaje II

Anul I, AR+ITT

1 Recapitulare

Curs 1 + Laborator 1

1.1 Comenzi

grid
hold
print
zoom
clf
figure

1.2 Funcții

plot()
real()
imag()
whitebg()
set()
title()
xlabel()
ylabel()
zlabel()
legend()
subplot()
meshgrid()
mesh()
contour()
text()

1.3 Altele

LineSpec - Specificatori de stil de linie


Specificatori de marker
Specificatori de culoare
ColorSpec - Specificatori de culoare:
Tripletul RGB
Numele scurt
Numele lung
PropertyName - Color
LineWidth
MarkerEdgeColor
MarkerFaceColor
MarkerSize
Secvențe TeX

1|Page
Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcţii definite de utilizator

Curs 2. Funcții definite de utilizator

2.1 Definirea unei funcții MATLAB. Comanda function

Funcțiile sunt rutine de program care acceptă argumente de intrare și returnează argumente de ieșire. Funcțiile
pot fi implementate în fișiere M de tip funcție, adică în fișiere text cu extensia .m și care încep cu o linie care
conține cuvântul cheie function. Prima linie dintr-un fișier M de tip funcție, cu excepția comentariilor, poartă
numele de linie de definire a funcției.

Sintaxă:

function [out1, out2, ...] = nume_functie(in1, in2, ...)

Descriere:
Instrucțiunea function definește funcția nume_functie, care acceptă valorile de intrare in1, in2, ... și
returnează valorile de ieșire out1, out2, ... .

2.1.1 Reguli de denumire a unei funcții

1. Numele funcției trebuie obligatoriu să înceapă cu o literă și poate conține caractere alfanumerice și caracterul
underscore (_). Numărul maxim de caractere din numele unei funcții trebuie să fie mai mic sau egal cu
dimensiunea maximă permisă de către implementarea specifică MATLAB.
Pentru verificarea dimensiunii maxime, se folosește comanda namelengthmax.
De exemplu, versiunea R2009b permite definirea de funcții cu nume de maxim 63 caractere.

>> version
ans =
7.9.0.529 (R2009b)
>> namelengthmax
ans =
63

În cazul în care numărul de caractere este mai mare, MATLAB va folosi doar primele 63 de caractere (în acest caz)
pentru identificarea funcției respective.
Deoarece numele de funcții respectă aceleași reguli ca și numele de variabile, se poate folosi funcția
isvarname() pentru verificarea valabilității numelui de funcție ales. Rezultatul este de tip boolean. Exemple de
nume valide sau invalide de funcții:

>> isvarname ipotenuza


ans =
1
>> isvarname Inf
ans =
1
>> isvarname _functie
ans =
0
>> isvarname NumeFoaaaarteLuuungDeFunctie
ans =
1
>> islogical(ans)
ans =
1

2. Numele unei funcții nu poate fi același cu al unui cuvânt cheie MATLAB. Verificarea unui cuvânt cheie MATLAB
se face cu ajutorul comenzii iskeyword.

>> iskeyword
ans =

2|Page
Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcţii definite de utilizator
'break'
'case'
'catch'
'classdef'
'continue'
'else'
'elseif'
'end'
'for'
'function'
'global'
'if'
'otherwise'
'parfor'
'persistent'
'return'
'spmd'
'switch'
'try'
'while'

3. Numele funcției definite într-un fișier M de tip funcție trebuie să coincidă cu numele fișierului, cu excepția
extensiei .m. În cazul în care numele funcției și numele fișierului nu coincid, numele intern al funcției va fi ignorat.
De exemplu, funcția tg() definită într-un fișier cu numele tangenta.m, va fi apelată prin expresia tangenta.

O funcție nu se poate defini într-un fișier script sau în fereastra de comenzi.

2.1.2 Argumentele unei funcții

Dacă o funcție are mai multe argumente de ieșire, acestea se vor include între paranteze pătrate, separate prin
virgulă:

function [perimetru, arie] = cerc(raza)

Dacă o funcție are mai multe argumente de intrare, acestea se vor include între paranteze rotunde, după numele
funcției, separate prin virgulă:

function aria = dreptunghi(lungime, latime)

Dacă o funcție nu are nici un argument de ieșire, ieșirea se va lăsa vidă:

function afisare(text)

sau se vor folosi paranteze pătrate vide:

function [] = afisare(text)

Parametrii transmiși funcției (parametrii actuali) nu este obligatoriu să coincidă ca nume cu cei linia de definire a
funcției (parametrii formali), dar trebuie să coincidă ca și număr, tip și ordine.

2.1.3 Sfârșitul unei funcții

O funcție se poate încheia fie la intâlnirea instrucțiunii end, fie la întâlnirea unei alte linii de definire a unei funcții,
fie la sfârșitul fișierului M în care este definită. Utilizarea instrucțiunii end la final este obligatorie doar dacă
funcția definită conține una sau mai multe funcții imbricate.

2.2 Spaţiul variabilelor unei funcții

Fiecare funcție definită într-un fișier M are alocată o zonă de memorie, diferită de spațiul global al variabilelor
(Workspace), în care ea funcționează. Această zonă se numește spațiul variabilelor funcției (Function Workspace)
şi reprezintă contextul propriu de lucru al funcţiei date.

3|Page
Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcţii definite de utilizator
2.3 Exemplu de definire a unei funcţii

ipotenuza.m
function c = ipotenuza( a, b )
%IPOTENUZA - Calculeaza ipotenuza unui triunghi dreptunghic, pe baza
%catetelor sale
% Sintaxa: c = ipotenuza( a, b )
c = sqrt(a^2 + b^2);
end

Informaţii de tip help:

>> help ipotenuza


IPOTENUZA - Calculeaza ipotenuza unui triunghi dreptunghic, pe baza
catetelor sale
Sintaxa: c = ipotenuza( a, b )
>> doc ipotenuza

Apelul funcţiei:

>> ipotenuza(2,3)
ans =
3.6056
>> ipotenuza(3,4)
ans =
5

2.4 Tipuri de funcţii

În mediul MATLAB pot fi definite următoarele tipuri de funcţii:

2.4.1 Funcţii primare

Funcţia primară reprezintă prima funcţie definită într-un fişier M de tip funcţie. După funcţia primară, în fişierele
M pot exista mai multe funcţii secundare, folosite ca şi subrutine ale funcţiei principale.
De obicei, funcţia primară este singura funcţie definită într-un fişier M de tip funcţie.

2.4.2 Funcţii secundare (subfunctions)

Funcţiile secundare sunt definite într-un fişier M de tip funcţie, ca şi funcţii adiţionale funcţiei primare, acestea
fiind vizibile doar din funcţia primară sau din alte funcţii secundare definite în acelaşi fişier.

Exemplu:

dreptunghi.m
function [ p a ] = dreptunghi( lungime, latime )
%DREPTUNGHI( lungime, latime )
% calculeaza perimetrul si aria unui dreptunghi
p = perimetru( lungime, latime );
a = arie( lungime, latime );
end
function per = perimetru( lungime, latime)
%PERIMETRU( lungime, latime )
% calculeaza perimetrul unui dreptunghi
per = 2 * (lungime + latime);
end
function ari = arie( lungime, latime)
%ARIE( lungime, latime )
% calculeaza aria unui dreptunghi
ari = lungime * latime;
end

Informaţii de tip help:


4|Page
Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcţii definite de utilizator

>> help dreptunghi


DREPTUNGHI( lungime, latime )
calculeaza perimetrul si aria unui dreptunghi
>> help dreptunghi>perimetru
PERIMETRU( lungime, latime )
calculeaza perimetrul unui dreptunghi
>> help dreptunghi>arie
ARIE( lungime, latime )
calculeaza aria unui dreptunghi

Apelul funcţiei dreptunghi():


>> [p a]= dreptunghi(1,2)
p =
6
a =
2

2.4.3 Funcţii imbricate (Nested Functions)

Funcţiile imbricate sunt funcţii definite în interiorul corpului altor funcţii. Se pot defini funcţii imbricate pe mai
multe nivele, dar nu pot fi definite în interiorul unei instrucţiuni de control al programului ( if, else, elseif,
switch, for, while, try sau catch).

cerc.m
function [ p a ] = cerc( raza )
%CERC( raza )
% calculeaza perimetrul si aria unui cerc
p = perimetru( raza );
a = arie( raza );
function per = perimetru( raza )
%PERIMETRU( raza )
% calculeaza perimetrul unui cerc
per = 2 * pi * raza;
end
function ari = arie( raza )
%ARIE( raza )
% calculeaza aria unui cerc
ari = pi * raza^2;
end
end

Informaţii de tip help:

>> help cerc


CERC( raza )
calculeaza perimetrul si aria unui cerc
>> help cerc>perimetru
PERIMETRU( raza )
calculeaza perimetrul unui cerc
>> help cerc>arie
ARIE( raza )
calculeaza aria unui cerc

Apelul funcţiei cerc():

>> [p a] = cerc(3)
p =
18.8496
a =
28.2743

2.4.4 Funcţii anonime

Pentru definirea lor se folosesc manipulatoarele de funcţie (function handles):


5|Page
Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcţii definite de utilizator

h = @(lista_arg) expr

Exemplu:

>> patrat = @(x) x^2


patrat =
@(x)x^2

creează o funcție anonimă care calculează pătratul valorii primite ca și parametru:

>> patrat(5)
ans =
25

2.4.5 Funcţii supraîncărcate (Overloaded Functions)

Funcţiile supraîncărcate sunt utile atunci când dorim să creăm funcţii care răspund diferit la date de intrare
diferite. Utilizarea funcțiilor supraîncărcate necesită cunoștințe de programare orientată obiectual.
Pentru a verifica toate definițiile unei funcții supraîncărcate, se folosește comanda which cu opțiunea -all. De
exemplu, la executarea instrucţiunii help pentru funcţia disp, se obţine următorul rezultat:

>> help disp


DISP Display array.
DISP(X) displays the array, without printing the array name. In
all other ways it's the same as leaving the semicolon off an
expression except that empty arrays don't display.

If X is a string, the text is displayed.

See also int2str, num2str, sprintf, rats, format.

Overloaded methods:
opaque/disp
MException/disp
inline/disp
cdfepoch/disp
timer/disp
serial/disp
memmapfile/disp
ftp/disp
mmreader/disp
audiorecorder/disp
audioplayer/disp
ccsstructure/disp
ccsstring/disp
ccsrtdx/disp
ccspointer/disp
ccsnumeric/disp
ccsfunction/disp
ccsenum/disp
ccsdebug/disp
ccsbitfield/disp
seqgen.disp
modem.disp
fittype/disp
cfit/disp
digitalio/disp
daqchild/disp
analogoutput/disp
analoginput/disp
distribution2d/disp
distribution1d/disp
distributed/disp
codistributor2d/disp
codistributor1d/disp
codistributed/disp
quantizer/disp
qfft/disp
strel/disp
imagemodel/disp

6|Page
Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcţii definite de utilizator
imaqdevice/disp
imaqchild/disp
iviconfigurationstore/disp
instrument/disp
icgroup/disp
xregpointer/disp
ghsmulti/disp
network/disp
opcda/disp
daitem/disp
dagroup/disp
piecewisedistribution/disp
gmdistribution/disp
classregtree/disp
dataset/disp
categorical/disp
sym/disp
vdspdebug/disp
vrworld/disp
vrnode/disp
vrfigure/disp
wptree/disp
wdectree/disp
ntree/disp
laurpoly/disp
laurmat/disp
dtree/disp

Reference page in Help browser


doc disp

Se observă că după afişarea informaţiilor help despre funcţia de bază, apare lista Overloaded methods, în care
sunt afişate toate funcţiile supraîncărcate, având acelaşi nume, disp, denumite în programarea obiectuală,
metode.
Pentru a verifica toate apariţiile funcţiei supraîncărcate disp(), se foloseşte comanda:

7|Page
Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcţii definite de utilizator

>> which -all disp


built-in (C:\Program Files\MATLAB\R2008b\toolbox\matlab\lang\disp)
C:\Program Files\MATLAB\R2008b\toolbox\matlab\lang\@opaque\disp.m % opaque method
disp is a built-in method % MException method
disp is a built-in method % hgsetget method
disp is a built-in method % gbtmcos.figure method
disp is a built-in method % handle method
disp is a built-in method % function_handle_workspace method
disp is a built-in method % gbtmcos.uitoolbar method
disp is a built-in method % gbtmcos.uipushtool method
disp is a built-in method % gbtmcos.uitoggletool method
disp is a built-in method % gbtmcos.uitogglesplittool method
disp is a built-in method % gbtmcos.uimenu method
disp is a built-in method % meta.class method
disp is a built-in method % helpUtils.helpProcess method
C:\Program Files\MATLAB\R2008b\toolbox\matlab\lang\@MException\disp.m % MException method
C:\Program Files\MATLAB\R2008b\toolbox\matlab\funfun\@inline\disp.m % inline method
C:\Program Files\MATLAB\R2008b\toolbox\matlab\imagesci\@cdfepoch\disp.m % cdfepoch method
C:\Program Files\MATLAB\R2008b\toolbox\matlab\iofun\@timer\disp.m % timer method
C:\Program Files\MATLAB\R2008b\toolbox\matlab\iofun\@serial\disp.m % serial method
C:\Program Files\MATLAB\R2008b\toolbox\matlab\iofun\@memmapfile\disp.m % memmapfile method
C:\Program Files\MATLAB\R2008b\toolbox\matlab\iofun\@ftp\disp.m % ftp method
C:\Program Files\MATLAB\R2008b\toolbox\matlab\audiovideo\@mmreader\disp.m % mmreader method
C:\Program Files\MATLAB\R2008b\toolbox\matlab\audiovideo\@audiorecorder\disp.m % audiorecorder method
C:\Program Files\MATLAB\R2008b\toolbox\matlab\audiovideo\@audioplayer\disp.m % audioplayer method
C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsstructure\disp.m % ccsstructure method
C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsstring\disp.m % ccsstring method
C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsrtdx\disp.m % ccsrtdx method
C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccspointer\disp.m % ccspointer method
C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsnumeric\disp.m % ccsnumeric method
C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsfunction\disp.m % ccsfunction method
C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsenum\disp.m % ccsenum method
C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsdebug\disp.m % ccsdebug method
C:\Program Files\MATLAB\R2008b\toolbox\ccslink\ccslink\@ccsbitfield\disp.m % ccsbitfield method
C:\Program Files\MATLAB\R2008b\toolbox\comm\comm\@seqgen\disp.m % seqgen method
C:\Program Files\MATLAB\R2008b\toolbox\comm\comm\@modem\disp.m % modem method
C:\Program Files\MATLAB\R2008b\toolbox\curvefit\curvefit\@fittype\disp.m % fittype method
C:\Program Files\MATLAB\R2008b\toolbox\curvefit\curvefit\@cfit\disp.m % cfit method
C:\Program Files\MATLAB\R2008b\toolbox\daq\daq\@digitalio\disp.m % digitalio method
C:\Program Files\MATLAB\R2008b\toolbox\daq\daq\@daqchild\disp.m % daqchild method
C:\Program Files\MATLAB\R2008b\toolbox\daq\daq\@analogoutput\disp.m % analogoutput method
C:\Program Files\MATLAB\R2008b\toolbox\daq\daq\@analoginput\disp.m % analoginput method
C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@distribution2d\disp.m % distribution2d method
C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@distribution1d\disp.m % distribution1d method
C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@distributed\disp.m % distributed method
C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@codistributor2d\disp.m % codistributor2d method
C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@codistributor1d\disp.m % codistributor1d method
C:\Program Files\MATLAB\R2008b\toolbox\distcomp\parallel\@codistributed\disp.m % codistributed method

8|Page
Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcţii definite de utilizator
C:\Program Files\MATLAB\R2008b\toolbox\filterdesign\quantization\@quantizer\disp.m % quantizer method
C:\Program Files\MATLAB\R2008b\toolbox\filterdesign\quantization\@qfft\disp.m % qfft method
C:\Program Files\MATLAB\R2008b\toolbox\images\images\@strel\disp.m % strel method
C:\Program Files\MATLAB\R2008b\toolbox\images\imuitools\@imagemodel\disp.m % imagemodel method
C:\Program Files\MATLAB\R2008b\toolbox\imaq\imaq\@imaqdevice\disp.m % imaqdevice method
C:\Program Files\MATLAB\R2008b\toolbox\imaq\imaq\@imaqchild\disp.m % imaqchild method
C:\Program Files\MATLAB\R2008b\toolbox\instrument\instrument\@iviconfigurationstore\disp.m % iviconfigurationstore method
C:\Program Files\MATLAB\R2008b\toolbox\instrument\instrument\@instrument\disp.m % instrument method
C:\Program Files\MATLAB\R2008b\toolbox\instrument\instrument\@icgroup\disp.m % icgroup method
C:\Program Files\MATLAB\R2008b\toolbox\mbc\mbc\@xregpointer\disp.m % xregpointer method
C:\Program Files\MATLAB\R2008b\toolbox\multilink\multilink\@ghsmulti\disp.m % ghsmulti method
C:\Program Files\MATLAB\R2008b\toolbox\nnet\nnet\@network\disp.m % network method
C:\Program Files\MATLAB\R2008b\toolbox\opc\opc\@opcda\disp.m % opcda method
C:\Program Files\MATLAB\R2008b\toolbox\opc\opc\@daitem\disp.m % daitem method
C:\Program Files\MATLAB\R2008b\toolbox\opc\opc\@dagroup\disp.m % dagroup method
C:\Program Files\MATLAB\R2008b\toolbox\stats\@piecewisedistribution\disp.m % piecewisedistribution method
C:\Program Files\MATLAB\R2008b\toolbox\stats\@gmdistribution\disp.m % gmdistribution method
C:\Program Files\MATLAB\R2008b\toolbox\stats\@classregtree\disp.m % classregtree method
C:\Program Files\MATLAB\R2008b\toolbox\shared\statslib\@dataset\disp.m % dataset method
C:\Program Files\MATLAB\R2008b\toolbox\shared\statslib\@categorical\disp.m % categorical method
C:\Program Files\MATLAB\R2008b\toolbox\symbolic\@sym\disp.m % sym method
C:\Program Files\MATLAB\R2008b\toolbox\vdsplink\vdsplink\@vdspdebug\disp.m % vdspdebug method
C:\Program Files\MATLAB\R2008b\toolbox\vr\vr\@vrworld\disp.m % vrworld method
C:\Program Files\MATLAB\R2008b\toolbox\vr\vr\@vrnode\disp.m % vrnode method
C:\Program Files\MATLAB\R2008b\toolbox\vr\vr\@vrfigure\disp.m % vrfigure method
C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@wptree\disp.m % wptree method
C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@wdectree\disp.m % wdectree method
C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@ntree\disp.m % ntree method
C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@laurpoly\disp.m % laurpoly method
C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@laurmat\disp.m % laurmat method
C:\Program Files\MATLAB\R2008b\toolbox\wavelet\wavelet\@dtree\disp.m % dtree method

9|Page
Conf.dr.ing. Ovidiu-Aurelian Deteşan – Programare si limbaje II Curs 2. Funcţii definite de utilizator
2.4.6 Funcţii private

Funcţiile private sunt funcţii definite în subdirectoare cu numele special private. Ele sunt vizibile doar din cadrul
funcţiilor şi fişierelor script care îndeplinesc următoarele condiţii:
1. O funcţie care apelează o funcţie privată trebuie să fie definită într-un fişier M situat într-un director imediat
deasupra subdirectorului private.
2. Un script care apelează o funcţie privată trebuie să fie apelat dintr-un fişier M de tip funcţie care are acces la
funcţia privată, conform regulii anterioare.
De exemplu, presupunând că directorul cerc_dir se află în calea de căutare MATLAB, un subdirector din cerc_dir,
având numele private, poate conţine funcţii care pot fi apelate doar din funcţiile definite în cerc_dir.
Se defineşte funcţia cerc() în directorul cerc_dir.

function [per, ari] = cerc( raza )


%CERC( raza )
% Calculeaza perimetrul si aria unui cerc
per = perimetru(raza);
ari = arie(raza);
end

Se definesc funcțiile perimetru() și arie() în directorul private din directorul cerc_dir.

function per = perimetru( raza )


%PERIMETRU( raza )
% Calculeaza perimetrul unui cerc
per = 2*pi*raza;
end

function ari = arie( raza )


%ARIE( raza )
% Calculeaza aria unui cerc
ari = pi*raza^2;
end

La apelul funcţiei cerc(), aceasta apelează, la rândul ei, funcţiile private perimetru() şi arie().

>> [p a]=cerc(5)
p =
31.4159
a =
78.5398

Obţinerea informaţiilor help despre cele trei funcţii se face astfel:

>> help cerc


CERC( raza )
Calculeaza perimetrul si aria unui cerc

>> help private/perimetru


PERIMETRU( raza )
Calculeaza perimetrul unui cerc

>> help private/arie


ARIE( raza )
Calculeaza aria unui cerc

Pentru afişarea informaţiilor de tip help despre funcţiile private, numele acestora se prefixează cu expresia
private/.

10 | P a g e