Sunteți pe pagina 1din 16

Laborator 4

Instruciuni i funcii de control n Matlab


1. Obiectivul lucrrii

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

Programele MATLAB sunt realizate cu pai secveniali, operaiile fiind realizate una dup alta, de
sus n jos. De multe ori pentru a realiza un set de instruciuni, nainte de a trece la urmtorul set de
instruciuni, sunt necesare cicluri repetitive care utilizeaz instruciuni repetitive sau/i instruciuni de
control logic. Astfel dac o anumit condiie este ndeplinit un set de instruciuni vor fi efectuate, i
eventual, dac este cazul, repetate.
Instruciunile puse la dispoziia programatorului n MATLAB sunt: if, while i for. Instruciunea if
este o instruciune de control logic, corpul apelrii aceste instruciuni variind funcie de numrul de
condiii disponibile. Instruciunile while i for sunt instruciuni repetitive cu control care se opresc
atunci cnd contorul ajunge la valoarea stabilit.

2. Mersul lucrrii

a) Operaii cu operatori relaionali i operatori logici n Matlab


Operatorii relaionali existeni n Matlab sunt:
Operatori relaionali
Scriere Literar
Scrierea n Matlab

Semnificaie

>

mai mare

>=

mai mare sau


egal

<

mai mic

<=

mai mic sau egal

==

identic

~=

diferit

Comparaia cu numere
complexe
Compar doar partea
real
Compar doar partea
real
Compar doar partea
real
Compar doar partea
real
Compar att partea real
ct i imaginar
Compar att partea real
ct i imaginar

La evaluarea unei expresii relaionale rezultatul returnat n Matlab poate fi 1 (ca interpretare
reprezentnd adevrat) sau 0 (ca interpretare reprezentnd fals).
Obs: - Pentru o expresie matriceal evaluarea se realizeaz element cu element astfel rezultnd o
matrice cu elemente 0 i 1.
- Primii patru operatori (< ,<=, >, >=) compar numai partea real a operanzilor (partea imaginar este
ignorat), iar ultimii doi operatori (== i ~=) trateaz att partea real ct i cea imaginar.
Exemple:

>>
>>
>>
>>

a=[2 4 7 8 9];
b=[1 -1 10 9 -12];
c=7;
a>=b

>> a=[2+i 4-3*i; 10+10*i 1-i];


>> b=[2-i 4+3*i; 10+10*i 1-i];
>> a>=b
ans =

ans =
1

1
1

>> a>b

1
1

>> a==b

ans =

ans =

>> a>c
ans =
0
>> a>=c
ans =
0

0
1

0
1

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

Pentru combinarea a dou sau mai multe expresii logice se utilizeaz operatorii logici din tabelul
urmtor:
Operatori logici
Scrierea literar Scrierea n Matlab
NU

Exemplu:

Prioritate
1

&

SAU

>> x=5;
>> cond1=(x>4)|(x>20)

>> x=2;
>> cond1=(x>4)|(x>20)

cond1 =
1

cond1 =
0

>> cond2=(x/4)~=0

>> cond2=(x/4)~=0

cond2 =
1

cond2 =
1

>> cond1 & cond2

>> cond1 & cond2

ans =

ans =
1

>> ~(cond1 & cond2)

>> ~(cond1 & cond2)

ans =

ans =

sau scrierea direct:

sau scrierea direct:

>> ~(((x>4)|(x>20))&((x/4)~=0))

>> ~(((x>4)|(x>20))&((x/4)~=0))

ans =

ans =
0

Exist funcii de control logic n Matlab

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

any(denumire_matrice_sau_vector ) testeaz dac cel puin un element este diferit de


zero; pentru o matrice evaluarea se face pe coloane; dac condiia este ndeplinit
rezultatul returnat va fi 1, altfel rezultatul returnat va fi 0.
>> A=[2 3 0; 0 7 0; 1 6 0]
A =
2
0
1
>> any(A)
ans =
1

3
7
6

0
0
0

any(<conditie>) - condiia implicita este inlocuita cu noua conditie; evaluarea se face tot
pe coloane.
>> any(A<-1)
ans =
0

>> any(A<1)
ans =
1

all(denumire_matrice_sau_vector ) evalueaza conditia implicita aplicata matricei sau


vectorului apelat; conditia testeaza dac toate elementele sunt diferite de zero; pentru o
matrice evaluarea se face pe coloane; dac condiia este ndeplinit rezultatul returnat va
fi 1, altfel rezultatul returnat va fi 0.
>> all(A)
ans =
0

all(<conditie>) condiia implicita este inlocuita cu noua conditie; evaluarea se face tot pe
coloane.

>> all(A==0)
ans =
0

find( ) returneaz indicii elementelor diferite de zero; evaluarea se face pe coloane.


De exemplu pentru matricea A anterior mentionat rezultatul returnat este:
ans =
1
3
4
5
6

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

>> find(A)

Ceea ce arata ca elementul 1, 3, 4, 5 si 6 au valoarea diferita de


zero.

find(<conditie> ) se apeleaz cnd se dorete returnarea indicilor la care se gsesc


elementele din matrice(vector) ce ndeplinesc condiia impus <conditie>
>> find(A==0)
ans =
2
7
8
9

isnan( ) testeaz dac elementele unei matrice sunt NaN (not-a-number); dac condiia
este ndeplinit rezultatul returnat va fi 1, altfel rezultatul returnat va fi 0.
>> A(2,1)=NaN
A =
2
NaN
1

3
7
6

0
0
0

0
0
0

0
0
0

>> isnan(A)
ans =
0
1
0

isinf( ) Testeaz dac elementele unei matrice sunt infinite; dac condiia este ndeplinit
rezultatul returnat va fi 1, altfel rezultatul returnat va fi 0.
>> A(2,3)=Inf
A =

2
NaN
1

3
7
6

0
Inf
0

0
0
0

0
1
0

>> isinf(A)
ans =
0
0
0

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

isfinite( ) testeaz dac elementele unei matrice sunt finite (diferite de NaN sau Inf).
>> isfinite(A)
ans =
1
0
1

1
1
1

1
0
1

a) Instruciunea de control logic if

a.1) Instructiunea if simpl

if <expresie_logica>

<grup_de_instruciuni>

end

Dac <expresie_logica> este adevrat, se execut <grup_de_instruciuni> intercalate


ntre instruciunea if i instruciunea end. Dac expresia logic este fals, se trece la prima instruciune
care urmeaz dup instruciunea end.
Exemple:

>> f=0;
>> x=6;
>> if x>=0
f=2*x;
end;
>> f

>> f=0;
>> x=-5;
>> if x>=0
f=2*x;
end;
>> f

f =

f =

12

Mai exist situaia cnd pot fi utilizate mai multe instruciuni if -> end intercalate:

if <expresie_logica_1>
<grup_de_instruciuni_1>
if <expresie_logica_2>
<grup_de_instruciuni_2>
end

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

<grup_de_instruciuni_3>
end

<grup_de_instruciuni_4>

Dac <expresie_logica_1> este 1 (ADEVRAT), se execut ntotdeauna grupurile de instruciuni


<grup_de_instruciuni_1> i <grup_de_instruciuni_3>. nainte de a trece la execuia grupului de
instruciuni <grup_de_instruciuni_3> se pot executa <grup_de_instruciuni_2> dac
<expresie_logica_2> este 1 (ADEVRAT). Dac <expresie_logica_1> este 0 (FALS), se trece
la grupul de instruciuni <grup_de_instruciuni_3>.
Obs: Indentarea este o operaie necesar la utilizarea instruciunilor if, deoarece pune n eviden
grupurile de instruciuni care se execut funcie de condiiile pe care le ndeplinesc.
Exemple:
x=-1;
f=0;

if x>=0
f=2*x;
y=-10;

x=7;
f=0;

x=6;
f=0;

if x>=0
f=2*x;
y=-10;

if x>=0
f=2*x;
y=-10;

if rem(x,2)==0
y=f+30;
end;

if rem(x,2)==0
y=f+30;
end;
y
end;
f

if rem(x,2)==0
y=f+30;
end;

end;
f

end;
f

y =

y =

-10

f =

f =

42

f =

14

a.2) Instructiunea if combinata cu clauza else

12

if <expresie_logica>
<grup_de_instructiuni_1>
else
<grup_de_instructiuni_2>
end

Dac

este
adevrat
se
execut
grupul
de
iar dac este fals se execut grupul de

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

<expresie_logica>
<grup_de_instructiuni_1>,
<grup_de_instructiuni_2>.

2 x , x 0
Exemplul urmtor arat implementarea unei funcii matematice: f x
2 x , in rest
instruciunea if combinat cu clauza else.
>> x=6;
>> if x>=0
f=2*x;
else
f=-2*x;
end;
>> f

>> x=-5;
>> if x>=0
f=2*x;
else
f=-2*x;
end;
>> f

f =

f =

12

a.3) Clauza elseif

instruciuni
instruciuni

folosind

10

Dac funcia matematic are mai multe nivele de instruciuni if-else, este dificil determinarea
expresiei logice adevrate, care selecteaz grupul de instruciuni ce urmeaz a fi executat, n acest caz,
se utilizeaz clauza elseif:
if <expresie_logica_1>

<grup_de_instructiuni_1>

elseif <expresie_logica_2>

<grup_de_instructiuni_2>

elseif <expresie_logica_3>

<grup_de_instructiuni_3>

end

- dac <expresie_logica_1>
<grup_de_instructiuni_1>;

este adevrat, este executat numai grupul de instruciuni

- dac <expresie_logica_1> este fals i <expresie_logica_2> este adevrat, se execut numai


<grup_de_instructiuni_2>;
- dac <expresie_logica_1> i <expresie_logica_2> sunt false, iar <expresie_logica_3> este
adevrat, se execut numai grupul de instruciuni <grup_de_instructiuni_3>;
- dac mai multe expresii logice sunt adevrate, prima instruciune logic adevrat determin care grup
de instruciuni este executat prima dat;
- dac nici o expresie logic nu este adevrat, nu se execut nici un grup de instruciuni din structura if.
Exemple:
>> f=0;g=0;h=0;
x=4;
if x>5
f=x^2;
elseif x<5
g=x^3;
elseif x==5
h=x^4;
end;
f
g
h

>> f=0;g=0;h=0;
x=5;
if x>5
f=x^2;
elseif x<5
g=x^3;
elseif x==5
h=x^4;
end;
f
g
h

Rezutatul returnat:
f =
49

Rezultatul returnat:
f =
0

Rezultatul returnat:
f =
0

g =

g =

g =

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

>> f=0;g=0;h=0;
x=7;
if x>5
f=x^2;
elseif x<5
g=x^3;
elseif x==5
h=x^4;
end;
f
g
h

0
h =

64

h =

h =

625

Mai exist i situaia cnd dac nici o expresie logic dintre primele trei nu este adevrat, se va
executa <grup_de_instructiuni_4> folosind clauza else.
if <expresie_logica_1>

<grup_de_instructiuni_1>

elseif <expresie_logica_2>

<grup_de_instructiuni_2>

elseif <expresie_logica_3>

<grup_de_instructiuni_3>
else
<grup_de_instructiuni_4>
end

Exemple:
>> f=0;g=0;h=0;
x=4;
if x>5
f=x^2;
elseif x<5
g=x^3;
else
h=x^4;
end;
f
g
h

>> f=0;g=0;h=0;
x=5;
if x>5
f=x^2;
elseif x<5
g=x^3;
else
h=x^4;
end;
f
g
h

Rezultatul returnat:
f =
49

Rezultatul returnat:
f =
0

Rezultatul returnat:
f =
0

g =

g =

g =

0
h =

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

>> f=0;g=0;h=0;
x=7;
if x>5
f=x^2;
elseif x<5
g=x^3;
else
h=x^4;
end;
f
g
h

64

h =

h =

625

b) Instruciunea repetitiv for


b.1) Instruciunea for simpl

Structura de apelare a instruciunii repetitive for este urmtoarea:


for <index> = <expresie>

<grup_de_instruciuni>

end

unde:
- <index> este numele contorului (de exemplu: i, a , n etc.);
- <expresie> este o matrice, un vector sau un scalar; de cele mai multe ori se utilizeaz forma X:Y
unde X este limia inferioar, iar Y este limita superioar a unui interval parcurs cu pasul de o unitate
(valoare default) n cazul n care nu este precizat; dac este precizat pasul <expresie> va avea forma
X:pas:Y (se poate consulta laboratoul n care au fost definii vectorii);
- <grup_de_instruciuni> este orice expresie MATLAB.
La fiecare pas de calcul <index> are valoarea unuia dintre elementele expresiei. Dac
este o matrice, 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 ciclice for.
La folosirea buclei for trebuie respectate urmtoarele reguli:
1. indexul buclei for trebuie s fie o variabil;
<expresie>

Exemplu:

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

2. dac expresia este o matrice goal, bucla nu se execut. Se va trece la urmtoarea instruciune dup
instruciunea end;
3. dac expresia este un scalar, bucla se execut o singur dat, cu indexul dat de valoarea scalarului;
4. dac expresia este un vector linie, bucla se execut de attea ori cte elemente are vectorul, de fiecare
dat indexul avnd valoarea egal cu urmtorul element din vector;
5. dac expresia este o matrice, indexul va avea la fiecare iteraie valorile coninute n urmtoarea
coloan a matricei;
6. la terminarea ciclurilor for, indexul are ultima valoare utilizat.

for x=1:10
y(x)=sin(x*2*pi);
end
y

Rezultatul returnat este:


y =

1.0e-014 *

Columns 1 through 9
-0.0245
-0.1959

-0.0490
-0.2204

-0.0735

-0.0980

-0.1225

-0.1470

-0.1715

Column 10
-0.2449

b.2) Instruciunea for n cascad

Mai multe cicluri for n cascad:

for <index1> = <expresie1>


for <index2> = <expresie2>

<grup_de_instruciuni[index1,index2]>

end
end

La fiecare iniializare a valorii lui <index1>, a doua bucl for se execut complet pentru toate valorile
lui <index2>. O noua iniializare a lui <index1> presupune o nou execuie a grupului de instructiuni
pentru toate (aceleasi) valorile lui index 2. Acest ciclu se repeta pana ce toate valorile lui index 1 au fost
parcurse. Schematic este ilustrat ma jos modul de executie al buclelor.
<index1> = <valoare1_1> <index2> = <valoare2_1> executa grup_inst
<index2> = <valoare2_2> executa grup_inst
...
<index2> = <valoare2_n> executa grup_inst

<index1> = <valoare1_2> <index2> = <valoare2_1> executa grup_inst


<index2> = <valoare2_2> executa grup_inst
...
<index2> = <valoare2_n> executa grup_inst
....

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

<index1> = <valoare1_n> <index2> = <valoare2_1> executa grup_inst


<index2> = <valoare2_2> executa grup_inst
...
<index2> = <valoare2_n> executa grup_inst

Obs: Se poate observa ca cel mai exterior end inchide primul for in timp ce cel mai interior end inchide
ultimul for. Deci inchiderea buclelor se face din interior catre exterior.
Exemple:

1. Sa se implementeze o matrice A cu n liinii (n=2) si ,m coloane (m=4). Toate elementele matricei


sunt egale cu 2.
n=2;
m=4;
for i=1:n
for j=1:m
A(i,j)=2;
end
end
A
A =
2
2

2
2

2
2

2
2

4 x , x 0
2. Sa se calculeze functia: f x
pentru x [10,10]
4 x , x 0
x=-12:12;
for i=1:length(x)
if (x(i)>=-10)&&(x(i)<=0)
f(i)=-4*x(i);
end
if (x(i)>0)&&(x(i)<=10)
f(i)=4*x(i);
end
if (x(i)<-10)||(x(i)>10)
disp('Eroare!')
end
end
f

Rezultatul returnat in Matlab este:

Eroare!
Eroare!
Eroare!
Eroare!
f =
Columns 1 through 15
0

40
0

40
4

36

32

28

24

20

16

12

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

Columns 16 through 23
12

16

20

24

28

32

36

40

c) Instruciunea repetitiv while

Instruciunea while este o structur care se utilizeaz pentru repetarea unui set de instruciuni, atta timp
ct o condiie specificat este adevrat. Formatul general al acestei instruciuni de control este
urmtorul:
while <expresie>

<grup_de_instruciuni>

end

Grupul de instruciuni se execut ct timp <expresie> are toate elementele nenule. <expresie> este de
obicei sub forma:
<expresie1> <conditie> <expresie2>

unde <conditie> este unul dintre operatorii relaionali: ==, <, >, <=, >=, ~=. Cnd condiia este
verificat (expresia este adevrat logic), se execut <grup_de_instruciuni> .
Exemplu:

a=[-1 3 4 -2];
b=0;
for i=1:max(size(a))
while a(i)>=0
disp(['La iteratia nr. ',int2str(i),':']);
elem_a=a(i)
disp('indeplineste conditia, deci:');
b=a(i)+5
break
end
end
Rezultat returnat in Matlab este:

La iteratia nr. 2:
elem_a =
3
indeplineste conditia, deci:
b =

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

8
La iteratia nr. 3:
elem_a =
4

indeplineste conditia, deci:


b =
9

Se poate observa ca a fost utilizata instruciunea break pentru a iei din bucl. Altfel in cazul nostru
bucla ar fi executata continu. Se recomand a fi utilizat dac o condiie de eroare este detectat n
interiorul unei bucle. Instruciunea break nceteaz execuia ciclurilor for i while. n cazul unor cicluri
imbricate, break comand ieirea din ciclul cel mai interior. Se apeleaz cu sintaxa: break.
Instruciunea return comand o ieire normal din fiierul-M ctre funcia care l-a apelat sau ctre
tastatur. Se apeleaz cu sintaxa: return.
d) Instruciunea switch

Instructiunea switch, impreuna cu case si otherwise, executa diferite grupuri de instructiuni in functie de
valoarea anumitor conditii logice:

switch <expresie>
case <valoare1>
executa <grup_de_instruciuni1> daca <expresie> = <valoare1>
case <valoare2>
executa <grup_de_instruciuni2> daca <expresie> = <valoare2>

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

...
case <valoareN>

executa <grup_de_instruciuniN> daca <expresie> = <valoareN>


otherwise

executa <grup_de_instruciuni>
end

Acest bloc consta in:

Cuvantul switch urmat de o expresie de evaluat.

Un anumit numar de grupuri case. Aceste grupuri constau din cuvantul cheie case urmat de o
valoare posibila, toate pe o singura linie. Liniile urmatoare contin instructiunile ce urmeaza a
fi executate pentru o valoare data a expresiei. Acestea pot fi reprezentate de orice
instructiune valida MATLAB incluzand eventual un alt bloc switch. Executia unui grup case
se sfarseste cand MATLAB intalneste urmatoarea instructiune case sau otherwise. Doar
instructiunile corespunzand primului case sunt executate.
Un grup optional otherwise. Acesta consta din cuvantul otherwise, urmat de instructiunile de
executat daca valoarea expresiei nu se incadreaza in nici unul din grupurile case anterioare.
Executia grupului otherwise se sfarseste cu instructiunea end.
Instructiune end.
Exemple:

y=[1 3 5 7 2 4 6 8];
for x=1:3
switch x
case 1
disp('Afisare y fara numere pare!');
for i=1:length(y)
if rem(y(i),2)==0
y(i)=0;
end
end
y

end
end

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

case 2
disp('Afisare y fara numere pare si fara numere impare!');
for i=1:length(y)
if rem(y(i),2)==1
y(i)=0;
end
end
y
otherwise
disp('Error! Case not found!');

O alta varianta este atunci cand

y=[1 3 5 7 2 4 6 8];
for x=1:5
switch x
case 1
disp('Afisare y fara numere pare!');
for i=1:length(y)
if rem(y(i),2)==0
y(i)=0;
end
end
y
case {2,3,4}
disp('Afisare y fara numere pare si fara numere impare!');
for i=1:length(y)
if rem(y(i),2)==1
y(i)=0;
end
end
y
otherwise
disp('Error! Case not found!');
end
end

3. Cerine

1. S se genereze o matrice A, cu n linii i n+1 coloane, ale crei elemente sunt:


2, daca i=j

A 1, daca i-j 1 .
0, in rest

i este contorul pentru linii si ,j este contorul pentru coloane.


2. S se calculeze funcia:


2 x 3, daca x 10, 2
pentru toate valorile ntregi pentru care este definit i s se reprezinte
f x 2
2
x
-1,
daca
x

2,
20

grafic utiliznd funcia plot n variant simpl (funcia definita in lab. 3).
3. S se genereze o matrice Hilbert de ordinul 4, ale crei elemente sunt date de
expresia: H i, j

1
i j 1

cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o

4. S se calculez i s se reprezinte grafic funcia f(x)=sinx pe intervalul [-1,1], cu pasul 0.1


5. S se scrie un program, utiliznd o bucl while, care calculeaz suma elementelor vectorului: x=[5 2 9 10 -1 9 -1] pn cnd ntlnete un numr mai mare ca 8.
6. Fie vectorul: y=[2 4 7 11 13 8 17 10 1];

sa se calculeze suma elementelor pare si sa se afiseze pozitia din vector a elementelor pare, respectiv
produsul elementelor impare pare si sa se afiseze pozitia din vector a elementelor impare.

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