Sunteți pe pagina 1din 19

LUCRAREA 12

Depanarea i optimizarea programelor MATLAB.

Pe parcursul conceperii i implement rii unui program MATLAB


se pot face o serie de erori. Primul tip de erori cu care ne întâlnim este cel
al erorilor sintactice, adic nu respect m regulile stabilite în MATLAB
pentru expresii,func ii i celelalte componente ale limbajului. Prezent m
trei dintre cele mai des întâlnite:
- Punerea gre it a paranteze;or în expresii. E exemplu:

>> 3/(2+3))
??? 3/(2+3))
|
Error: Unbalanced or misused parentheses or brackets.

La sfâr itul expresiei a fost pus o parantez în plus. De remarcat modul


cum semnaleaz MATLAB erorile sintactice – prin scrierea
aten ion rilor cu culoare ro ie.
- Nescrierea,omiterea unui operator:

>> x=2;
>> 5*(4+2x)
??? 5*(4+2x)
|
Error: Missing MATLAB operator.

În exemplul de mai sus apare eroarea cea mai des întâlnit – omiterea
operatorului înmul ire ’*’.
- Scrierea incorect a numelui variabilelor, a func iilor, etc.

>> 1+2*sinx
??? Undefined function or variable 'sinx'.
Eroarea const în scrierea incorect a func iei sin x. în MATLAB toate
func iile au argumentul scris între paranteze rotunde. Deci corect este
sin(x).

1
Erorile sintactice sunt u or de depistat pentru c ni le semnaleaz
MATLAB. Un program nu este executat de MATLAB pân când nu mai
are nici o eroare sintactic .
Odat lansat în execu ie un program MATLAB poate depista o
alt clas de erori numit ’ erori de execu ie’. Exemplul tipic este
împ r irea cu 0. i alte tipuri de func ii i opera ii pot duce la rezultate
nedorite: NaN, Inf sau empty matrix:

>> x=-2:0.1:2;
>> y=x;
>> [x,y]=meshgrid(x,y);
>> z=x.*sin(y)./(x.^2-y.^2);
Warning: Divide by zero.

Eroare provine din faptul c atunci când x=y în calculul lui z


apare o împ r ire cu 0. În Ex.5 de la Lucrarea 9 am ar tat cum se rezolv
astfel de erori: In acest caz definim variabila aayy=x@ - y2 i apoi d m
comanda:
>> xxyy=xxyy+(xxyy==0)*eps
ce va introduce valoarea foarte mic eps în locul elementelor nule. Deci
secven a corect este:

>> x=-2:0.1:2;
>> y=x;
>> [x,y]=meshgrid(x,y);
>> xxyy=x.^2-y.^2;
>> xxyy=xxyy+(xxyy==0)*eps;
>> z=x.*sin(y)./xxyy;

În sfâr it programul func ioneaz f r erori. Dar dac totu i nu


ob inem rezultatul dorit?!! Cauza este c am dat peste cea de-a treia
categorie de erori , i anume erorile logice. Sunt cele mai greu de depistat
erori pentru c MATLAB nu se ocup de logica programului. Logica
programului este un lucru ce ine numai de cel ce programeaz . Erorile
logice pot fi prevenite i depistate mai u or dac respecta i câteva reguli
nescrise ale program rii. În primul rând programul trebuie conceput
modularizat. Aceasta înseamn s descompune i programul în module ce
vor deveni func ii sau scripturi. Trebuie testat fiecare modul în sensul
verific rii faptului c la ni te date de intrare modulul livreaz înapoi date
de ie ire corecte. Alte reguli ar fi urm toarele:

2
1. F un test cu un set de date ini iale pentru care rezultatele finale i
unele rezultate intermediare sunt cunoscute i compar cu ce ai
ob inut.
2. Pentru a vedea unele rezultate intermediare care ar fi utile în
depanare anuleaz ; de la sfâr itul liniei comenzii pentru a vedea
imediat rezultatul comenzii. (Lucru nerecomandabil în mod
obi nuit).
3. Adaug comenzi care s listeze unele variabile cheie dar i locul în
program unde au fost listate (poate ulterior au fost modificate).
4. Utilizeaz comanda keyboard care opre te execu ia programului i
d controlul tastaturii ceea ce permite s d m o comand de
vizualizarea a oric rei variabile dorite.
5. Utilizeaz pentru programele mari utiliza i comenzile func iei
debugger din fereastra edit. Acest mod presupune o oarecare
experien în programarea în MATLAB
Observa ie. Toate recomand rile de mai sus duc la încetinirea
substan ial a execu iei programului i trebuie înl turate dup depanare.
Am corectat erorile sintactice, i cele de execu ie, i cele logice i în
sfâr it programul face ce trebuie s fac . Totu i nu suntem mul umi i.
Timpul de rulare este nea teptat de mare. Trebuie s îmbun t im
performan a programului, s -l optimiz m. Pentru m surarea timpului de
execu ie avem comenzile tic i toc. Defini i scriptul rxtictoc dat de:
tic
t=1;
for i=1:10000000
t=(t+i)/t;
end
t
toc
Dac -l punem în execu ie ob inem (pentru un P4 cu 1GB DDR400):
>> rxtictoc
t=
3.162777778741289e+003
Elapsed time is 0.297000 seconds.
Vom prezenta câteva tehnici de reducere a timpului de execu ie a
programelor MATLAB.
A. Vectorizarea. Sub acest nume sunt cunoscute metodele prin care
anumite opera ii se execut asupra întregii matrici i nu element cu
element. De exemplu înmul irea element cu element a unei matrici se
poate face individual sau printr-o singur comand : Definim scriptul inm
de mai jos:

3
Lans m in execu ie scriptul inm:

>> A=ones(1000,1000);
>> B=A;
>> inm
Elapsed time is 0.031000 seconds.
Elapsed time is 0.063000 seconds.

Se observ c timpul de execu ie vectorizat este mult mai mic. Este util
s utiliz m vectorizarea i în cazul func iilor. Scriptul vecsin este un
exemplu simplu cu rezultatele:

>> t=0:0.01:100000;
>> i=0;
>> vecsin
Elapsed time is 4.453000 seconds.
Elapsed time is 4.719000 seconds.

Iar scriptul este:

4
În afara execu iei mai rapide vectorizarea are i avantajul scrierii unui
num r mai mic de comenzi ( anse mai mici de eroare) i al cre terii
clarit ii programului.
Observa ie. Performan ele cod rii nevectorizate au crescut mult la
versiunea MATLAB6.5(r13) i mai ales la versiunea MATLAB7(r14).
De aceea în exemplele de mai sus diferen ele de timp sunt mult mai mici
decât la versiunile anterioare. Totu i diferen a în favoarea vectoriz rii
exist plus celelalte avantaje.
B. Func ii build-in. Este bine s utiliz m func ii built-in, adic deja
existente decât s definim noi o func ie. Am mai vorbit în Lucrarea 9
despre calculul factorialului. S vedem acum cât dureaz calculul lui 70!.
Scriptul de execu ie este:

>> n=70;
>> testfb
Elapsed time is 0.000000 seconds.
Elapsed time is 0.016000 seconds.
Elapsed time is 0.016000 seconds.

Scriptul testfb i func ia fact:

5
6
Se remarc primul timp pentru gamma(71) foarte mic. Timpul pentru
prod(1:70) este egal cu cel pentru func ia noastr fact dar m car nu am
scris decât comanda de apel.
C. Prealocarea. Este esen ial pentru performan s prealoc m
matricile (mai ales cele mari). Astfel dac ele for fi create element cu
element MATLAB va m ri dimensiunile noii matrici la fiecare calcul. În
plus exist riscul ca matricea creat sa nu ocupe un spa iu continuu în
memorie ceea ce duce evident la sc derea vitezei de acces. Vom m sura
timpii pentru ambele situa ii. Matricea B este creat în scriptul preal1:

Testul în MATLAB este:


>>k=10000;
>>n=1000;
>> A=floor(k*rand(n,n));
>> [r,c]=size(A);
>> preal1
Elapsed time is 14.234000 seconds.
>> B=zeros(r,c); % Aici prealoc m B
>> preal1
Elapsed time is 0.297000 seconds.

7
Se observ timpul substan ial mai mic în cazul prealoc rii. Primele trei
comenzi arat cum se creeaz o matrice de ordin n cu numere întregi
aleatoare pe intervalul [0, k].
D. Accesarea indexat . De i este considerat de unii drept principala
component a vectoriz rii, consider m c merit o prezentare special . În
esen accesarea indexat înlocuie te c utarea elementelor matricii A ce
verific o anumit condi ie cu expresia A(condi ie) ce livreaz un vector
ce con ine toate elementele ce verific aceast condi ie.. Dup cum am
mai exemplificat i în lucr rile anterioare A(A>0) va livra un vector ce
are ca elemente elementele pozitive ale lui A. În exemplul urm tor ne
propunem s calcul m suma elementelor mai mari decât 5 ale unei
matrici A. Scriptul suma5 va face acest lucru cu i f r indexare i
compar timpii de calcul:

Execut m scriptul suma5:


>> A=floor(10*rand(10000,1000));
>> [r,c]=size(A);
>> suma5
ans =
29986704

8
Elapsed time is 0.578000 seconds.
s=
29986704
Elapsed time is 0.922000 seconds.
Se observ faptul c timpul de calcul este substan ial redus prin
accesarea indexat .

Aplica ii

1.Scrie i exact a a cum este scris scriptul supr1, apoi depana i-l :

x=-2:0,2:2;
y=(6-x)./(3-x;
(x,y)=meshgraid(x,y);
z=(x.^2+y.^2)/(x*y);
Surf(x,y,z)

2.S se determine matricea alab ale c rui elemente sunt ob inute din
elementele a doi vectori a i b astfel: fiecare element al lui a este ridicat
la puterea fiecare element al lui b. De exemplu dac a=[1,2] i b= [2,3],
11 21 1 4
atunci alab va fi alab = 3 3
, adic : alab =
1 2 1 8
3. Tips and tricks. Sub acest nume în informatic se în elege mecheria,
trucul cu care ob inem mai rapid o solu ie. In acest punct de vedere
vectorizarea pare c face parte din aceast categorie.
a) Cum definim o matrice a c rui elemente sunt egale cu un num r dat.
Da-ti cel pu in dou solu ii.
b) Cum ob inem un vector a c rui elemente sunt în ordine invers cu cele
ale unui vector dat? Da- i o solu ie cu bucl i una vectorizat .
c) Cum definim o matrice de tip mXn cu coloane identice cu un vector
dat? Da i cel pu in dou solu ii.

4.Vectorizarea buclei for cu if. Deseori prelucrarea elementelor unei


matrici conduce l dou bucle for îmbricate (pentru a accesa elementul) i
un if pentru prelucrare:
for i=1:r
for j=1:c
if cond
prelucrare1 a(i,j);

9
else
prelucrare2 a(i,j);
end
end
end
De exemplu pentru condi ie avem a(i,j)>5, iar prelecrare 1 poate fi
a(i,j)=a(i,j)=5, iar prelucrare 2 : a(i,j)=-a(i,j).
Cum se scrie aceast secven f r nici un for i f r if?

5. S se scrie o func ie indlinie care are ca parametru de intrare o matrice


Iar ca parametru de ie ire o matrice cu acela i num r de linii i cu dou
coloane ce va con ine indicii primului element nenul al fiec rei linii din
matricea ini ial . Matricea de ie ire va avea mai pu ine linii dac în
matricea de intrare exist linii numai cu 0. Încerca i s determina i i o
form vectorizat a func iei.

6. S se creeze o func ie vectz care are ca parametru de intrare un vector,


x, iar ca parametru de ie ire un vector y de aceia i lungime ca i x, a;e
c rui elemente nenule sunt acelea i ca elementele corespunz toare din x,
iar în locul elementelor nule se pune valoarea elementului nenul anterior.
Astfel dac x=[1 3 0 0 0 4 5 0 0 6 0 7] atunci y=[ 1 3 3 3 3 4 5 5 5 6 6 7].
Se va presupune c x are întotdeauna primul element nenul.

Indica ii

1.Erori sintactice:
Linia 1 col. 7 – se pune punct în loc de virgula zecimal (nota ia
american );
Linia 2 col .14 – parantez închis ;
Linia 3 col. 3 – paranteze p trate pentru parametrii de ie ire;
Linia 3 col. 7 – func ia meshgraid inexistent (este meshgrid);
Linia 4 col. 14 – opera ia de împ r ire cu punct;
Linia 4 col. 18 – opera ia de împ r ire cu punct;
Linia 5 col. 1 - func ia surf cu litera s mic;
Erori de execu ie:
Linia 4 - împ r ire cu 0;

2. Este clar c alab va fi o matrice cu num rul de linii egal cu lungimea


lui b iar num rul de coloane egal cu lungimea lui a. se pot face dou

10
bucle for imbricate pentru determinarea elementelor lui alab. Aceasta
este forma clasic a program rii. MATLAB are func ia meshgrid ce
transform vectorii în matrici i care poate fi utilizat .

3. a) O solu ie ar fi utilizarea lui ones(n,m). O alt solu ie ar fi utilizarea


func iei repmat(A,n,m) care repet o matrice A de n ori pe linie i de m
ori pe coloan .
b) Definim o bucl în care primul element al noului vector s fie egal cu
ultimul element al celui dat, al doilea element al noului vector s fie egal
cu penultimul element al celui dat, . a. m. d. pentru vectorizare putem
utiliza adresarea cu operatorul :.
c) Fiind vorba de o matrice o vom crea cu dou bucle for îmbricate.
Exist i forme vectorizate ale scriptului bazate pe concatenare i
operatorul : sau repmat.

4. Se va utiliza accesarea indexat .

5. Prelucrarea obi nuit a elementelor unei matrici cu dou bucle for i


un if ca la Ex. 4 anterior se complic prin faptul c apare o condi ie în
plus (aceasta este prelucrarea doar a primului element din linie). Cum
MATLAB memoreaz matricile pe coloan vectorizarea acestei
probleme trebuie altfel gândit (dac este posibil)..Pentru prelucrarea cu
for-if este necesar un semnal care s ne spun c pentru linia în execu ie
am g sit deja primul element. Pentru matricea y de ie ire este necesar un
indice de lucru special ce trebuie incrementat cu 1 la fiecare memorare de
indici.

6. Este necesar o variabil în care s memor m pe parcursul unei


prelucr ri cu o bucl for ultimul element nenul. Aceast variabil trebuie
ini ializat cu valoarea primului element din x (presupus nenul).
Varianta vectorizat se bazeaz pe urm toarele observa ii. S
presupunem c avem vectorul x=[x1,x2,0,0,x3,0,x4] i putem ob ine
vectorul diferen elor elementelor nenule consecutive
xdcons=[x1,x2-x1,0,0,x3-x2,0,x4-x3],
atunci vectorul solu ie
vsol=[x1,x2,x2,x2,x3,x3,x4]
se ob ine prin aplicarea func iei cumsum asupra lui xdcons. Func ia
cumsum(x) creeaz un vector ce are pe pozi ia k suma elementelor lui x
de la 1 la k, adic pentru vdcons de mai sus
x1 deci x1

11
x1+(x2-x1) deci x2
x1+(x2-x1)+0 deci x2
x1+(x2-x1)+0+0 deci x2
x1+(x2-x1)+0+0(x3-x2) deci x3
x1+(x2-x1)+0+0(x3-x2)+0 deci x3
x1+(x2-x1)+0+0(x3-x2)+0+(x4-x3) deci x4.

Solu ii
1.

12
2.

13
Execu ia:
>> a=1:10000;
>> b=1:20;
>> alab1
Elapsed time is 2.516000 seconds.
>> alab2
Elapsed time is 0.250000 seconds.
Se remarc timpul mult mai mic al scriptului vectorizat.

3. a) Presupunem c t este constanta egal cu toate elementele i n i m


dimensiunile matricii. Putem da oricare din comenzile:
>> A=k*ones(n,m);
Sau
>>A=k; A=repmat(A,n,m);
b) O bucl for rezolv problema:
for i=1:length(v)
w(i)=v(length(x)-i+1);
end
Vectorul w va con ine elementele lui v în ordine invers . Vectorial:
W=v(end:-1:1)

14
Iat o utilizare interesant a lui end.
c)Presupunem c avem vectorul coloan v de dimensiune m. Atunci
putem creaa matricea M astfel:
for i=1:m
for j=1:n
M(i,j)=v(i);
end
end
Variantele vectorizate sunt:
N=v(:,ones(n,1))
Sau
O=repmat(v,1,n)

4. Scriptul ini ial este forcuif :

Scriptul cu indexare fararor:

15
Func ia indlinie nevectorizat este:

16
Iar func ia vectorizat indliniv este:

Punerea în execu ie:


>> A=[ 0 0 1 ;0 1 0 ;0 0 1 ;1 1 2 ;0 2 1 ; 0 0 0 ;0 0 2 ];
A=
0 0 1
0 1 0
0 0 1
1 1 2
0 2 1
0 0 0
0 0 2
>> y=indlinie(A)
y=
1 3
2 2
3 3
4 1
5 2
7 3
>> y=indliniv(A)

17
y=
1 3
2 2
3 3
4 1
5 2
7 3
Pe fiecare linie a lui y prima valoare este linia , iar a doua valoare este
coloana elementelor c utate

6. Func ia vectz (cu bucla for cu if) este:

Func ia vectorizat (cu func iile fiind, diff i cumsum) este:

18
Punerea în execu ie:
>> x=[1 3 0 0 0 4 5 0 0 6 0 7] ;
>> vectz(x)
ans =
1 3 3 3 3 4 5 5 5 6 6 7
>> vectzo(x)
ans =
1 3 3 3 3 4 5 5 5 6 6 7
Aceast problem 6 este un exemplu c uneori vectorizarea este complex
i nu aduce avantaje deosebite.

19

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