Documente Academic
Documente Profesional
Documente Cultură
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
Semnificaie
>
mai mare
>=
<
mai mic
<=
==
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
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
ans =
ans =
1
ans =
ans =
>> ~(((x>4)|(x>20))&((x/4)~=0))
>> ~(((x>4)|(x>20))&((x/4)~=0))
ans =
ans =
0
cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o
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(<conditie>) condiia implicita este inlocuita cu noua conditie; evaluarea se face tot pe
coloane.
>> all(A==0)
ans =
0
cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o
>> find(A)
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
if <expresie_logica>
<grup_de_instruciuni>
end
>> 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>
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
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
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>;
>> 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
<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
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
<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
cop
adr
y
ian righ
a.b t re
url
s
iba erve
sa@ d to
ug
al.r
o
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:
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
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
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
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_instruciuni>
end
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!');
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
A 1, daca i-j 1 .
0, in rest
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
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.