Documente Academic
Documente Profesional
Documente Cultură
X=[1,2,3,4,5] sau:
X=[1 2 3 4 5]
Virgula si spatiul sunt echivalente in acest caz.
Sau asa:
X=1:5
Variante:
X=[5,4,3,2,1]
X=5:-1:1
La modul general
X=limita_inf : cuanta : limita_sup
Cuanta poate fi fractionala sau negativa!
X este vectorul transpus lui X
Y=X'
Y =
5
4
3
2
1
Se poate aplica un vector ca argument al unei functii:
De exemplu, sin(X) este un vector de aceeasi dimensiune cu X, care are ca elemente
sinusul elementelor lui X.
Se poate scrie si direct:
sin(1:5)
sin(1:2:20)
Matricile se pot defini asa:
A = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12]
Raspunsul este:
A
1
5
9
=
2 3 4
6 7 8
10 11 12
( A * B ) ij = Aik * Bkj
k =1
Exemplu:
Daca
A=
1 2 3
4 5 6
7 8 9
B=[10, 20,30]
A*B=
1*10+2*20+3*30
4*10+5*20+6*30
7*10+8*20+9*30
Nota: B este transpusa lui B
Vom reveni asupra matricilor.
De retinut comanda whos, care listeaza variabilele definite in cursul programului sau
a sesiunii de lcuru curente.
Poti sa verifici daca o variabila este definita, tastandu-i numele.
De exemplu:
% definire variabilei
x=2
%....
x
Si obtii raspunsul:
x=
2
Nota:
Comentariile se delimiteaza cu simbolul %
A=[1 2 3 4]
B=[4 5 6 7]
C=[A;B]
length(C) intoarce 4.
Pentru a afla dimensiunea unei matrici, se foloseste comanda SIZE
SIZE(C)
ans
2 4
Elementele individuale ale unui vector
Acestea pot fi adresate astfel:
A=[1 2 3 6 8 10]
A(1)
1
A(4)
6
A(5)
8
Observatie: Nu se incepe numerotarea de la zero ci de la 1!!
In cazul unei matrici, se poate adresa un element oarecare cu:
C(i,,j) % i este numarul liniei j este numarul coloanei
Array multiplication
Este produsul element cu element a doi vectori.
Se simbolizeaza cu .*
Exemplu:
>> A=[1:2:10]
A =
1
3
5
>> B=[3:2:11]
B =
3
5
7
>> P=A.*B
P =
3
15
35
11
63
99
Functia SUM
Pentru un vector, intoarce suma elementelor.
Exemplu:
A=[1 2 3 4]
sum(A)=1+2+3+4
Daca argumentul sum este o matrice, sum() intoarce un vector linie care are ca
elemente suma elementelor de pe fiecare coloana a matricii argument.
Exemplu:
>> A=[1 2 3 4]
>> B=[3 4 5 6]
>> C=[A;B]
C =
1
3
>> sum(C)
ans =
4
6
2
4
3
5
4
6
10
2
4
3
5
4
6
C(:,2)
ans =
2
4
3
5
4
6
D =
3
y =
[ 7+4*2^(1/2)]
[ 7-4*2^(1/2)]
double ([x,y])
ans =
3.8284
12.6569
-1.8284
1.3431
Exemplu de mai sus este un sistem de ecuatii cu doua solutii.
Se pot izola valorile individuale ale solutiilor cu
x(1)
Care intoarce:
ans =
1+2*2^(1/2)
si
y(1)
ans =
7+4*2^(1/2)
x(2)
ans =
1-2*2^(1/2)
y(2)
ans =
7-4*2^(1/2)
Mai sunt si alte moduri/comenzi pentru rezolvarea unor ecuatii, dar nu ma
intereseaza deocamdata.
Mai multe despre plotting
1. Comanda AXIS
AXIS([XMIN XMAX YMIN YMAX])
Defineste limitele plot-ului
Atentie vectorul de intrare pentru axis() se refera intai la limitele pentru axa x si apoi
la limitele pentru axa y NU la perechi (x,y) cum ar parea logic!!
2. Comanda PLOT(x,y,S)
Daca x, y sunt scalari atunci se ploteaza un punct in plan cu ccoordonatele (x,y)
Parametrul S indica ce simbol sa se foloseasca pentru reprezentarea punctului.
- omiterea parametrului se pune un punct
Cateva optiuni posibile pentru S
- S=x
- S=o
- S=*
- S=p ; pentagram
- S=h hexagram
Daca sunt mai multe puncte de plotat, se poate scrie:
plot(x1,y1,S,x2,y2,S,x3,y3,S.....)
De regula, parametrii x si y ai plot sunt vectori.
Specifier
w
k
b
r
c
g
m
y
Daca vrem sa specificam simultan ca e vorba de linie intrerupta de culoare verde, atunci
includem in aceleasi ghilimele ambii specificatori:
plot(x,f,'-',x,g,'g--') % dashed line
Comanda FPLOT
Exemplu:
fplot('exp(2*t)*sin(t)',[0,4]), xlabel('t'), ylabel('f(t)'),
title('Damped Spring Forcing')
Parametrii xlabel, ylabel sunt facultativi.
Comanda fplot este mai putin pretentioasa decat plot:
Seamana mai mult cu ezplot decat cu plot parametrii sunt string-uri, delinitate de
ghilimele simple.
Observatie importanta!!!
Secventa de comenzi:
t = [0:0.01:4];
f = exp(-2*t)*sin(t);
plot(t, f)
Desi pare corecta, genereaza o eroare. Eroarea provine de la faptul ca exp(-2*t) si
sin(t) sunt VECTORI (matrici).
Corect, trebuie sa folosim array multiplication (.*), care are ca efect inmultirea
element cu element a celor doi vectori!!!
Deci corect este:
t = [0:0.01:4];
f = exp(-2*t).*sin(t);
plot(t, f)
Crearea unor grafice cu plot-uri multiple
Comanda HOLD ON/OFF
Mentine deschisa fereastra unde se genereaza plot-ul si pentru urmatoarele comenzi
plot/ezplot.
Exemplu:
ezplot('exp(-x)', [0 10])
hold on
ezplot('sin(x)', [0 10])
Asta are ca efect figura urmatoare:
Comanda LEGEND
Adauga o legenda la un plot multiplu:
Ex:
plot(x,y,'g-',x,z,'--b'); legend('sin(x)','cos(x)')
Comanda LINSPACE
LINSPACE(X1, X2) generates a row vector of 100 linearly equally spaced points
between X1 and X2.
LINSPACE(X1, X2, N) generates N points between X1 and X2.
Este cumva similara cu:
X=[a1:q:a2]
Care genereaza un vector cu valori intre a1 si a2, distantata cu cuanta q.
Comanda polar(x,y)
Este similara cu plot() dar traseaza graficul in coordonate polare
Comanda loglog(x,y)
Simlara cu plot, dar foloseste scara logaritmica pe ambele axe
Comanda semilog(x,y)
Similara cu plot cu axa logaritmica pe axa x.
Comanda bar(x,y)
Genereaza un plot de tip bargraf.
Exemplu:
x = [1:5];
y = [50,98,75,80,98];
bar(x,y), xlabel('Student'),ylabel('Score'), title('Final Exam')
90
80
70
60
Sco
re
50
40
30
20
10
3
Student
Exemplu:
for (x=1:0.1:10)
if(x>=4.5) break;
end
end
x
x =
4.50000000000000
Nota: In exemplul de mai sus sunt doua statement-uri end unul pentru for
si unul pentru if !!
Se poate si asa:
N=10;
for (x=1:0.1:N)
if(x>=4.5) break;
end
end
3. SWITCH
Exemplu:
N=3;
switch(N)
case 3
disp('
end
Got it
Got it')
Exercitiu:
Sa se rezolve sistemul de ecuatii liniare:
3x + 4y + 5z = 2
2x 3y + 7z = 1
x 6y + z = 3.
Solutie:
[x, y, z] = solve(3*x + 4*y + 5*z = 2, 2*x - 3*y + 7*z = -1, x - 6*y + z = 3, x, y, z)
Verificarea rezultatului:
A = [3, 4, 5; 2, -3, 7; 1, -6, 1]; A*[x; y; z]
ans =
[ 2]
[ -1]
[ 3]
%!!!
ans =
sin(x)*cos(y)+cos(x)*sin(y)
Functia simplify
Exemplu:
simplify(cos(x)^2+sin(x)^2)
ans =
1
Note despre debugging
Daca dorim putem plasa breakpoints in programe, ca sa putem inspecta
variabilele.
asta se face din menu sau cu comanda dbstop
Daca dorim sa continuam executia se foloseste dbcont
In final dbclear pentru stergerea breakpoint-urilor sau dbquit, ca sa
terminam programul.
DBSTOP poate fi conditionat, de exemplu:
DBSTOP IF WARNING
Note despre dialogul cu operatorul
Functia disp(mesaj)
Functia input(mesaj)
exemplu:
x=input(Introduceti un numar: )
%Examples:
%
setcurve('color','red')
%
setcurve('color','green','linestyle','--')
%Type help plot to see available colors and line styles
function setcurve(varargin)
h=get(gca,'children');
set(h(1),varargin{:})
O problema uzuala
Se da o matrice X=[-1:0.01:1]
Se cere graficul plot(X,Y) unde Y este o matrice de forma
Y=[1,f(x(1,i))]
Fiecare element al matricii Y este o functie de elementul corespunzator al
matricii X.
Una din solutii este, de exemplu:
ezplot('(1/(1+exp(-2.2*x)))', [-1,1])
Daca vrem sa folosim plot(X,Y), atunci Y trebuie sa fie o matrice de
aceeasi dimensiune cu X.
Pentru asta ne trebuie o functie
File:sigmoid.m
% presupunem ca X este o matrice linie (1,i)
function Y=sigmoid(X)
sigma=2.2;
for (i=1:1:length(X))
Y(1,i)=1+exp(-1*sigma*X(1,i));
Y(1,i)=1/Y(1,i);
end
Sigma poate fi si el pasat ca parametru:
% presupunem ca X este o matrice linie (1,i)
function Y=sigmoid(X,sigma)
for (i=1:1:length(X))
Y(1,i)=1+exp(-1*sigma*X(1,i));
Y(1,i)=1/Y(1,i);
end
Cazul cand Y contine niste date experimentale care se citesc dintr-un
fisier dintr-un fisier:
Y=load('record.dat'); % le citeste ca o coloana
Y=Y'; %Y este transpusa lui Y
X=[1:1:length(Y)];
hold on
plot(X,Y);
Nota
Dimensiunile unei matrici se pot afla cu comanda size
E util de exemplu cand citim matricea dintr-un fisier.
sa=size(A)
ans=
215 8
Recapitulare
a. Comenzi de file management
PWD print working directory. Afiseaza directorul curent
DIR listeaza fisierele din directorul curent
LS echivalent cu DIR (pentru utilizatori invatati cu Linux)
CD change directory
Merge si CD ..
MKDIR make directory
RMDIR remove directory
COPYFILE copiere fisier
DELETE - sterge fisier
Adaugarea unor directoare la calea (PATH) curenta se face fin meniul
principal
File -> Set path
b. Numere complexe
5+4i este un numar complex
5+4*i i este interpretat ca o variabila!!
c. Sintaxa generala a comenzilor
O comanda lunga poate fi continuata pe linia urmatoare, de exemplu:
a=1+2+3+4; % este echivalent cu:
a=1+2+... % trei puncte
3+4;
De asemenea, pe aceeasi linie se pot introduce mai multe comenzi
separate prin virgula sau ; De exemplu:
a=5, b=7, c=6
sau
a=5; b=7; c=6; %fara afisare
Comanda diary(filename)
diary(filename) creaza un fisier text in care se pastreaza
tot dialogul din fereastra de comenzi, pana la comanda diary off. E
utila pentru incepatori, daca vrei sa reicitesti secvente de exercitii.
MATRICI
1. Modalitati de definire a variabilelor de tip matrice s
si
i vector
a. Comenzile zeros si
si ones
A=zeros(3) are ca efect crearea unei matrici (3x3) cu toate elementele
egale cu zero.
A =
0
0
0
0
0
0
>> A=zeros(1,4)
0
0
0
A =
0
0
0
0
0
>> A=zeros(2,4)
A =
0
0
0
0
>> B=ones(4,2)
B =
1
1
1
1
1
1
1
1
>> size(B)
ans =
4
b. Comanda eye
Creaza matrici diagonale
Exemplu:
>> eye(4)
ans =
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
0
1
0
0
0
1
0
0
0
Merge si:
>> eye(3,4)
ans =
1
0
0
0.0845
0.6618
0.5165
0.2126
0.4850
0.4113
-1.6041
0.2573
-1.0565
1.4151
-0.8051
0.5287
0.2193
-0.9219
-2.1707
d. Comanda linspace
Genereaza un vector. Se poate folosi in doua moduri:
i.
x=linspace(lim1,
x=linspace(lim1, lim2)
lim2)
>> B=[1,2,3,4]
B =
Observatie:
Asignarea directa REDEFINESTE matricea, daca ea era deja definita!! De
exemplu, secventa:
>> A=zeros(4)
A =
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
2
6
3
7
4
8
Sau asa:
>> A=[1 2 3 4 ; 5 6 7 8]
>> B=[1;2;3;4]
B =
1
2
3
4
f. Definirea vectorilor folosind operatorul colon :
Exemple de sintaxa:
>> A=[1:3:8]
A =
1
0
0
0
0
0
0
0
1
0
0
0
0
>> A(1,3)=2
0
0
0
>> A(1,2)=1
A =
1
0
0
2
0
0
>> C=A(:,3)
C =
2
0
0
Observatie: Aici trebuie evitata confuzia intre paranteze patrate si
rotunde!
Se pot izola si linii sau coloane incomplete
>> X=A(1, [2 3])
X =
2
A =
1
5
9
13
2
6
10
14
3
7
11
15
4
8
12
16
>> C=A(1:end,
C=A(1:end, 2)
C =
2
6
10
14
>> D=A(1:3, 2:3)
D =
2
6
10
3
7
11
6
10
7
11
5
6
10
14
5
7
11
15
5
8
12
16
Combinarea elementelor din mai multe matrici pentru a obtine o noua matrice
>> A = [1 1 1; 1 1 1], B = [2 2 2; 2 2 2], C =...
[3 3 3; 3 3 3]
A =
1
1
1
1
1
1
2
2
2
2
2
2
3
3
3
3
3
3
1
1
1
1
B =
C =
>> X=[A, B]
X =
1
1
>> Y=[A;B]
2
2
2
2
2
2
Y =
1
1
2
2
1
1
2
2
1
1
2
2
1
1
1
1
2
2
2
2
2
2
1
1
2
2
2
2
3
3
2
2
3
3
2
2
3
3
3
3
3
3
3
3
Se poate si asa:
>> W=[A B; B C]
W =
1
1
2
2
1
1
2
2
Operatii cu matrici
matrici
a. Adunarea si scaderea
De exemplu, daca X si Y au aceleasi dimensiuni, atunci
Z=X+Y are elementele Z(m,n) = X(m,n) + Y(m,n)
De exemplu, daca
A =
1
1
1
1
1
1
B =
3
3
3
3
Atunci A+B
ans =
3
3
4
4
4
4
b. Inmultirea matricilor
E de doua feluri:
Array multiplication. Z=X.*Y Se foloseste cand avem doua matrici X si Y
de aceleasi dimensiuni iar Z=X.*Y are elementele
Z(m,n) = X(m,n) * Y(m,n)
- Matrix multiplication Z=X*Y
Asta este imultirea propriu-zisa de matrici din algebra
-
Z (m, n) = X (m, k ) * Y (k , n)
k
Matrix division
Cele doua forme de matrix division implica folosirea conceptului de
matrice inversa, sau pseudo-inversa, care vor fi analizate mai tarziu
FUNCTII
Sintaxa generala:
variabila=function_name(arg1, arg2,...argN)
Exista totusi si in MATLAB functii void (care nu intorc nici o valoare,
dar altereaza niste avriabile globale) si functii de argument void.
Apelarea lor se face prin simpla invocare a numelui fara paranteze.
Exemplu functia rand intoarce un numar pseudoaleator
O particularitate importanta a functiilor MATLAB (multe din ele) este
polimorfismul: adica pot fi apelate cu un numar variabil de parametri,
sau pot intoarce mai mult de o variabila! (asta nu e posibil in alte
limbaje).
Exemplu:
A =
1
1
1
1
1
1
>> size(A)
ans =
2
>> [m,n]=size(A)
%se asigneaza cele doua valori intoarse de size variabilelor m si n!!
m =
2
n =
3
a =
Observatie:
Am incercat sa folosesc functia input dintr-o functie definita de mine:
File: kbin.m
function kbin
a=input('Introduceti ceva:')
end
Cand o apelez:
>> kbin
Introduceti ceva:123
a =
123
In schimb, daca incerc sa asignez valoarea intoarsa catre o variabila,
obtin o eroare:
>> x=kbin
??? Error using ==> kbin
Too many output arguments.
Geseala e urmatoarea:
File: kbin.m
function a=kbin
a=input('Introduceti ceva:')
end
>> x=kbin
Introduceti ceva:123
a =
123
x =
123
Observatie:
>> whos
Name
Size
x
Bytes
1x1
Class
double array
8
8
Functia disp(var);
Afiseaza variabila, fara a indica si numele:
>> x=[1 2 3 4];
>> x
x =
1
2
>> disp(x)
1
2
Functia fprintf
Seamana cu printf din C/C++.
Exemple de utilizare:
>> fprintf('Avem un numar oarecare, %d\n', 3.0);
Avem un numar oarecare, 3
>> fprintf('Avem un numar oarecare, %d\n', 3.05);
Avem un numar oarecare, 3.050000e+000
>> fprintf('Fie un string: %s\n', 'Asta e string-ul');
Fie un string: Asta e string-ul
>> fprintf('Fie un caracter: %c\n', 'C');
Fie un caracter: C
>> fprintf('Fie un numar zecimal: %f\n', 234.556);
Fie un numar zecimal: 234.556000
>> fprintf('Fie un numar zecimal: %5.2f\n', 234.556);
Fie un numar zecimal: 234.56
>> fprintf('Fie un numar zecimal: %2.2f\n', 234.556);
Fie un numar zecimal: 234.56
>> fprintf('Fie un numar zecimal: %2.0f\n', 234.556);
Fie un numar zecimal: 235
Se observa ca face rotunjire automat, daca nu_i dam voie sa afiseze toate
zecimalele.
>> fprintf('Fie un numar intreg afisat hex: %2X\n', 234);
Fie un numar intreg afisat hex: EA
>> fprintf('Fie un numar zecimal afisat hex: %2X\n', (234.3));
Fie un numar zecimal afisat hex: 2.30e+002
Nu vrea cu numere negative !!
>> fprintf('Fie un numar negativ zecimal exprimat hex: %16X\n', -1);
Fie un numar negativ zecimal exprimat hex:
-1.000000e+000
FUNCTIA plot
plot
Cel mai simplu mod de a o apela este:
plot(x,y)
Unde x si y sunt doi vectori
Exemplu:
x = 0:0.1:2*pi; y1 = sin(x);
y2=cos(x);
Dupa ce am definit vectorii, se poate scrie:
plot(x,y1);
Dar merge sa folosim doua sau mai multe seturi de vectori:
plot(x,y1,
plot(x,y1, x,y2);
si iese ceva de genul asta:
Observatie.
Este posibil ceva de genul urmator:
x1=linspace(0, 2*pi);
x2=linspace(-pi/2, 2*pi);
y1=sin(x1);
y2=cos(x2);
plot(x1,y1,x2,y2)
si se obtine:
iar: plot(x1,y1,'g--',x2,y2,'bd');
rezulta in:
Comenzi
Comenzi auxiliare pentru plot
axis
axis equal modifica figura in felul urmator:
>>
>>
>>
>>
>>
axis equal
grid on
xlabel('angle in radians');
ylabel('amplitude in Volts');
title('Some diagram');
PROGRAM LOOPS
Bucle de tip for. Au structura generala:
for variable = expression
statements
end
Exemplu:
for ii = 1:10
fprintf(\n Loop Count: %d\n, ii);
end
Expresia care defineste bucla for are forma generala
for ii=limit1:quantum:limit2
Exemplu:
>> for ii=1:2:10
fprintf('Loop count= %d\n', ii);
end
Loop count= 1
Loop count= 3
Loop count= 5
Loop count= 7
Loop count= 9
Merge si asa: (indexul definit de un sir de valori)
for ii = [-2 4 6 -7 3 5 -45 1 -0.5 2.6]
if ii > 0
fprintf(%f \n, ii);
end
end
Mult mai interesant, se poate face acelasi lucru si asa:
x=[-2 4 6 -7 3 5 -45 1 -0.5 2.6];
for ii = 1:length(x)
if x(ii) > 0
fprintf('%f \n', x(ii));
end
end
In bucle for se poate folosi break pentru iesirea prematura.
Bucle de tip while
Exemplu:
% test pentru bucle de tip while
n = 1;
total = 0;
while n <= 10
total = total + n;
fprintf('n=%d, Total=%d\n', n, total);
if(total>=30) break;
end
n = n + 1; %incrementarea indexului e treaba utilizatorului
end
Observatii:
1.
2.
3.
Functiile se definesc in fisiere m de sine statatoare cate un fisier pentru fiecare functie.
Numele fisierului trebuie sa coincida cu numele functiei
Definitia functiei trebuie sa fie prima linie necomentata din fisier. Daca incercam sa
definim o variabila inainte de a defini functia, obtinem o eroare (Attempt to use a script
as a function)
Cuvantul function apare primul in expresia de definitie a functiei;
Spre deosebire de C o functie poate intoarce mai multe valori. Sunt obligatorii
parantezele patrate in definitia liste de valori de iesire
O functie desteapta (Sita lui Eratostene) pentru gasirea numerelor prime mai mici decat
numarul specificat in argument.
File:myprimes.m
function list_of_primes = myprimes(N)
% MYPRIMES Returns a 1xN vector of all the primes from 1 to N
% Method: Sieve of Eratosthenes (ca 240 BC)
% Variables:
% prime 1xN, prime(n) = 1 if n is prime, 0 if n is not prime.
% (1) Assume that all the integers from 2 to N are prime.
all_numbers=1:N;
prime = ones(1,N);
prime(1) = 0;
% (2) Mark all the numbers that are multiples of a number:
for n = 2:sqrt(N) % No factor can be larger than sqrt(N)
if prime(n) % Multiples of primes include all multiples
prime(n+n:n:N) = 0;
end
end
Asta e sita.
Apoi se fac doua operatii importante:
prime=logical(prime)
Asta converteste valorile numerice 0 si 1 din vectorul prime in valori logice.
Apoi se foloseste indexarea logica
list_of_primes = all_numbers(prime);
prin care se extrag in variabila list_of_primes doar elementele din all_numbers indicate de 1
(logic) din prime.
Alta tehnica demna de retinut este linia de cod:
prime(n+n:n:N) = 0;
care indica mai multe operatii executate asupra vectrului prime. Asta se facea relativ greu in
C/C++.
Exemplu step by step de functionare:
>> prime=ones(1,10)
prime =
1
1
1
1
>> n=2
>> prime(n+n:n:10) = 0
prime =
1
Se folosesc in functii care se apeleaza de mai multe ori si isi pastreaza valorile inte apleuri.
Conceptul e cumva similar cu variabilele statice din C.
Definitia trebuie sa apara inainte de orice folosire
Exemplu de folosire a variabilelor persistente:
function count = running_total(x)
%running_total Maintains a running total of all values passed to the function
% Function running_total will print the sum total of all values passed to it.
persistent total;
%
%
%
%
%
if isempty(total)
total = 0;
end
%
%
%
%
The first time this function is run, total exists as a persistent variable,
but it's an empty matrix. This conditional checks to see if the matrix is
empty. If it is, that means it's the first time the function has been run
and the value of total is set to zero.
total = total + x;
count = total;
function test_real(n)
if iscomplex(n)
fprintf('E numar complex\n');
else
fprintf('E numar real\n');
end
Exemplu:
>> class(10)
ans =
double
1. Date numerice
>> x=10
x =
10
>> x=uint8(x)
x =
10
>> x=x*30
??? Error using ==> *
Function '*' is not defined for values of class 'uint8'.
Functii in legatura cu sirurile
Exemple:
>> x=num2str(pi)
x =
3.1416
>> class(x)
ans =
char
>> x=num2str(pi)
x=
3.1416
>> a=str2num(x)
a=
3.1416
handle to figure
structure with handles and user data (see GUIDATA)
Recapitulare
Luam ca referinta programul /learn/GUI3 care simuleaza aruncarea unor corpuri in camp
gravitational si traseaza traiectoria rezultanta. Exista un buton Aruncare si doua slider-e
unul care ajusteaza viteza initiala si celalalt unghiul de aruncare.
- definirea variabilelor suplimentare se face in functia gui_OpeningFcn
handles=guidata(hObject);
%citim structura
%aici definim noile variabile!!!!!!
handles.speed=100;
handles.unghi=45;
handles.intensity_factor=0.5;
handles.angle_factor=0.5;
%citim structura
speed=handles.speed;
intensity_factor=handles.intensity_factor;
angle_factor=handles.angle_factor;
speed=speed*intensity_factor;
unghi=90*angle_factor;
% guidata(hObject, handles);
%n-am nevoie sa salvez nimic aici
throw(speed,unghi);
%executia efectiva
Despre debugging
file
file at location
file if expression
file at location if expression
condition
Folosind GUIDE ,am modificat proprietatile String si Tag ale obiectelor din GUI ca sa arate asa:
Am modificat codul generat automat in functiile callback asociate cu butoanele, in felul urmator:
% --- Executes on button press in Clear_Button.
function Clear_Button_Callback(hObject, eventdata, handles)
% hObject
handle to Clear_Button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
m=get(handles.edit1,'String');
set(handles.edit1,'String','');
% --- Executes on button press in Message_Button.
function Message_Button_Callback(hObject, eventdata, handles)
% hObject
handle to Message_Button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
m=get(handles.edit1,'String');
set(handles.msg_disp,'String',m);
Variatiune, proiectul dialog2 care muta cu doua butoane mesajul intre doua Edit-box-uri.
Pasul urmator: Proiectul /Learn/sumator
Are urmatoarele obiecte:
Se incepe prin a defini doua variabile suplimentare num1 si num2 care reprezinta valorile numerice
asociate cu sirurile introduse in cele doua Edit-box-uri.
Asta se face intotdeauna in functia sumator_OpeningFcn
% --- Executes just before sumator is made visible.
function sumator_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject
handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% varargin
command line arguments to sumator (see VARARGIN)
% Choose default command line output for sumator
handles.output = hObject;
num = str2double(get(hObject,'String'));
if isnan(num)
num = 0;
set(hObject,'String',num);
errordlg('Input must be a number', 'Error')
end
handles.num1 = num;
guidata(hObject,handles)
function edit2_Callback(hObject, eventdata, handles)
% hObject
handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit2 as text
% str2double(get(hObject,'String')) returns contents of edit2 as a double
num = str2double(get(hObject,'String'));
if isnan(num)
num = 0;
set(hObject,'String',num);
errordlg('Input must be a number', 'Error')
end
handles.num2 = num;
guidata(hObject,handles)
Si pentru butoane:
Butonul de adunare (Tag = Add_Button
% --- Executes on button press in Add_Button.
function Add_Button_Callback(hObject, eventdata, handles)
% hObject
handle to Add_Button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
addition = handles.num1 + handles.num2;
set(handles.result, 'String', addition);
% result este Static text-ul unde se afiseaza rezultatul
Butonul Clear (Tag=Clear_button) sterge atat campurile de tip edit-box cat si rezultatul
handles.num2=0;
set(handles.result, 'String', 0);
guidata(hObject,handles)
Incepem prin a defini doua variabile suplimentare speed si angle, pe care le salvam in structura
handles.
function GUI4_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject
handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% varargin
command line arguments to GUI4 (see VARARGIN)
% Choose default command line output for GUI4
handles.output = hObject;
% Aici cream noile variabile!!!!!!
% cream doua variabile NUMERICE
handles.speed=50;
handles.angle=45;
% Update handles structure
guidata(hObject, handles);
% eventdata
% handles
Si pentru pushbutton
function Throw_Button_Callback(hObject, eventdata, handles)
% hObject
handle to Throw_Button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
handles=guidata(hObject);
%citim structura
speed=handles.speed;
angle=handles.angle;
throw(speed,angle);
function throw2(varargin)
% Flight trajectory computation
%
if nargin<2
disp('Too few arguments');
return;
end
% Initial values
g = 9.81; % gravity, ft/s^2
viteza=varargin{1};
theta = varargin{2} * pi/180; % launch angle, radians
% Compute and display results
disp('time of flight (s):') % label for time of flight
tg = 2 * viteza * sin(theta)/g % time to return to ground, s
disp('distance traveled (ft):') % label for distance
xg = viteza * cos(theta) * tg % distance traveled
% Compute and plot flight trajectory
t = linspace(0,tg,256);
x = viteza * cos(theta) * t;
y = viteza * sin(theta) * t - g/2 * t.^2;
if nargin==2
hold on;
plot(x,y), axis equal, axis([ 0 1100 0 450 ]), grid on, ...
xlabel('Distance (m)'), ylabel('Height (m)'), title('Flight
Trajectory')
else
hold off;
plot(0,0), axis equal, axis([ 0 1100 0 450 ]), grid on, ...
xlabel('Distance (m)'), ylabel('Height (m)'), title('Flight
Trajectory')
end
Se observa ca se poate testa numarul de argumente al functiei (nargin) si se pot extrage argumentele
din varargin{} .
Folosirea RADIO BUTTONS
Proiect /Learn/GUI5
E un upgrade la GUI4 in care introducem in pluis un radio button care controleaza HOLD ON/OFF
pentru plot.
Definim o variabila suplimentara:
function GUI5_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
handles.output = hObject;
% Aici cream noile variabile!!!!!!
handles.speed=50;
handles.angle=45;
handles.rbstatus=0; %radio button status
% Update handles structure
guidata(hObject, handles);
Folosirea check-box-urilor
Proiect: /Learn/Beat
%citim structura
Ilustreaza grafic si sonor compunerea a doua oscilatii cu frecvente apropiate care dau fenomenul de
batai.
GUI-ul arata asa:
Detalii
function beats_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject
handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
% varargin
command line arguments to beats (see VARARGIN)
% Choose default command line output for beats
handles.output = hObject;
%%%ADDED%%%
% initialise global variable cf
global cf;
cf=1000;
%%%%%%%%%%%
% Update handles structure
guidata(hObject, handles);
values to fit in the range from -1.0 to 1.0, so that the audio is played as loudly as possible
without clipping.
specifies the bit depth (that is, the precision) of the sample values. The
possible values for bit depth depend on the audio hardware available on your system. Most
platforms support depths of 8 bits or 16 bits. If you do not specify bits, the soundsc function
plays at an 8-bit depth.
soundsc(y,Fs,bits)
soundsc(y,Fs,bits,range), where range is of the form [low high], maps the values
between low and high to the full sound range. The default range is [min(y) max(y)].
Specifying Fs and bits is optional.
Tips
The soundsc function supports sound devices on all Windows and most UNIX
platforms.
Most sound cards support sample rates between 5 kHz and 48 kHz. Specifying a
sample rate outside this range produces unexpected results.
in y
Variatiuni: /Learn/beats2
Observati1:
Din GUIDE, daca salvam cu Save as si schimbam numele figurii, se creaza automat fisierul m asociat
cu noul nume, care pastreaza toate modificarile facute de user!!
Se poate modifica proprietatea Style a check-box-urilor, sa arate ca un Toggle Button, sau
Pushbutton, sau Radio button, fara sa modificam deloc codul.
Cea ma semnificativa variatiune pe tema asta este sa definim un edit box unde sa introducem
valoarea frecventei de batai bf.
Pentru asta, avem nevoie de inca o variabila globala:
function beats3_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
% initialise global variables
global cf;
global bf;
cf=1000;
bf=100;
Variatiune: Sa scriem matricea in fisier, cate o linie a matricii pe o linie a fisierului de iesire.
File: fcreate2.m
% asta e un script nu o functie!
% definim o matrice A si o scriem intr-un fisier text, in asa fel incat s-o
% putem reconstitui usor.
A=rand(4,8);
[m n]=size(A); % m contine numarul de linii, n numarul de coloane al A
fid=fopen('mdata2.txt','w');
if fid<0
disp('Cannot open file');
return
end
for i=1:m
for j=1:n
fprintf(fid, '%4.0f ', 1000*A(i,j));
end
fprintf(fid, '\r\n');
end
fclose(fid);
Variatiune.
Sa se scrie o functie care primeste ca argumente numele fisierului si numarul de linii si coloane al
matricii de iesire. Citeste datele din fisier si intoarce o matrice de dimensiunea specificata cu datele
citite din fisier.
File: fread2.m
function B=read(file_name, m, n)
% m si n sunt dimensiunile matricii de iesire care contine datele din
% fisier
fid=fopen(file_name,'rt');
if fid<0
disp('Cannot open input file')
return
end
A=fscanf(fid, '%d');
A=A';
fclose(fid);
k=1;
B=zeros(m,n);
for i=1:m
for j=1:n
B(i,j)=A(k);
k=k+1;
end
end
%A is a local variable
%
%
%
%
FILE: serial_hello.m
Creaza un nou obiect de tip serial port (COM1)
il deschide
trimite un string pe linia seriala
inchide portul si sterge variabilele asociate
fopen(newport)
fwrite(newport, 'Hello World! - cu fwrite');
fprintf(newport, 'Alt mesaj emis cu cu fprintf');
fprintf(newport, '%3.0f', 123);
A=1:5;
fprintf(newport, A); % se emite 0x01, 0x02, 0x03, 0x04, 0x05!!!
fclose(newport);
delete(newport)
clear newport;
Se pot schimba individual parametrii portului, de exemplu:
set(newport, 'BaudRate', 4800)
set(newport, 'InputBufferSize',
set(newport, 'TimeOut', .1);
300 )
De clarificat:
- detalii despre fwrite
- exista diferente de sintaxa/utilizare fwrite in cazul scrierii in fisiere sau in port?
- dar in privinta fprintf?
Un interludiu
Functia fill deseneaza un poligon plin cu o culoare specificata
Exemple:
fill (X, Y, c)
X si Y sunt matrici care contin coordonatele colturilor poligonului
c este culoarea
c este o matrice de forma [R G B] unde R, G, B sunt numere intre 0 si 1.
De exemplu: [1 1 1] inseamna alb [0 0 0] inseamna negru, [1 0 0] inseamna rosu pur
Exemplu de utilizare:
file: corners.m
% o functie care primeste ca argumente coordonatele (x,y) ale unui
% punct din plan si o constanta a - cell size si creaza DOI vectori X, Y
% care contin coordonatele colturilor unui patrat cu centrul in punctul
% (x,y)
% Numerotarea colturilor incepe cu cel din dreapta-jos si se continua in
% sens trigonometric
% defineste colturile unui patrat de latura a in jurul punctului specificat
function [X,Y]=corners(x,y,a)
x1=x+a/2;
x2=x+a/2;
x3=x-a/2;
x4=x-a/2;
y1=y-a/2;
y2=y+a/2;
y3=y+a/2;
y4=y-a/2;
X=[x1 x2 x3 x4];
Y=[y1 y2 y3 y4];
Nota:
In main, inainte de a apela draw_map() e necesar sa scriem:
figure(1);
hold on;
axis equal;
In continuare, avem nevoie de o functie paint_cell(x,y,color_shade) care sa coloreze celula hartii,
corespunzatoare coordonatelor(x,y) specificate.
Se presupune ca cell_size este globala.
De exemplu, varianta asta, care afiseaza nuante de gri:
%
%
%
%
%
function paint_cell(x,y,color_shade,cell_size)
color_shade=1-color_shade;
if x>=0
center_x=cell_size*floor(x/cell_size)+cell_size/2;
else
center_x=cell_size*floor(x/cell_size)-cell_size/2;
end
if y>=0
center_y=cell_size*floor(y/cell_size)+cell_size/2;
else
center_y=cell_size*floor(y/cell_size)-cell_size/2;
end
[X,Y]=corners(center_x,center_y,cell_size);
color=[color_shade, color_shade, color_shade];
fill(X,Y,color);
Imi propun sa generez niste sunete cu frecventa/forma controlata si sa le inregistrez intr-un fisier
wav.
Functia MATLAB care scrie efectiv datele in fisier este:
WAVWRITE Write Microsoft WAVE (".wav") sound file.
WAVWRITE(Y,FS,NBITS,WAVEFILE) writes data Y to a Windows WAVE
file specified by the file name WAVEFILE, with a sample rate
of FS Hz and with NBITS number of bits. NBITS must be 8, 16,
24, or 32. Stereo data should be specified as a matrix with two
columns. For NBITS < 32, amplitude values outside the range
[-1,+1] are clipped.
WAVWRITE(Y,FS,WAVEFILE) assumes NBITS=16 bits.
WAVWRITE(Y,WAVEFILE) assumes NBITS=16 bits and FS=8000 Hz.
Daca folosim valorile implicite de mai sus, matricea Y care trebuie pregatita pentru o secunda de ton
ar trebui sa aiba 8000 de elemente. (in intervalul [-1,1])
Exemplu:
x=linspace(0,1,8000)
y=sin(2*pi*x)
plot(x,y)
file: snd1.m
total_time=3;
%in secunde
Fs=20000;
% sample frequency. Numarul de esantioane pe secunda
total_samples=Fs*total_time; % numarul total de esantioane
f0=7.6;
% frecventa sunetului generat in Hz
x=linspace(0,total_time,total_samples);
y=sin(2*pi*f0*x);
plot(x,y);
%sound(y,Fs);
wavwrite(y,Fs,'rada.wav');
file: snd2.m
total_time=3;
%in secunde
Fs=40000;
% sample frequency. Numarul de esantioane pe secunda
total_samples=Fs*total_time; % numarul total de esantioane
f0=7.6;
% frecventa sunetului generat in Hz
f1=16000;
x=linspace(0,total_time,total_samples);
y=(sin(2*pi*f0*x)).*(sin(2*pi*f1*x));
plot(x,y);
sound(y,Fs);
wavwrite(y,Fs,'rada2.wav');
Varianta cu modulatie de frecventa
%Modulatie de frecventa
total_time=2;
%in secunde
Fs=40000;
% sample frequency. Numarul de esantioane pe secunda
total_samples=Fs*total_time; % numarul total de esantioane
f0=8;
% frecventa sunetului generat in Hz
f1=15000;
t=linspace(0,total_time,total_samples);
fm=f1+1000*sin(2*pi*f0*t);
y=0.9*sin(2*pi*t.*fm);
plot(t,y); axis ([0 0.01 -1 1]);
%sound(y,Fs);
wavwrite(y,Fs,'rada2.wav');
De notat aici si modul de plot cu specificarea axelor.