Sunteți pe pagina 1din 62

Curs 2

MATLAB
The Language of Technical
Computing

matrici/vectori/scalari
operatori relationali si logici
instructiuni de control
Baza structurilor de date - Matricea

Matlab-ul lucreaza numai cu un singur tip de obiecte
MATRICEA numerica rectangulara cu elemente reale
sau complexe, sau orice expresie Matlab.
Anm se acceseaza prin A(n,m) - elementele unei
matrici, elementul de la intersectia liniei n cu
coloana m.
Dimensiunea matricei e data de perechea (n x m).
Indicii incep de la valoarea 1.

Vectorii sunt asimilati :
vector linie – matrice cu o linie (1 x n)
vector coloana – matrice cu o coloana (n x 1).
v(k) – elementul de pe pozitia k din vector

Scalarii sunt asimilati matricilor cu o singura linie si o
singura coloana (1x 1).
Definirea matricilor

In Matlab o matrice se poate defini in mai multe feluri:

• Se introduce o lista explicita de elemente.



Se genereaza matricea folosind instructiuni si functii.

• Se incarca matricea din fisiere de date externe.

• Se creaza matricea folosind propriile functii, fisiere.m.


Definirea matricilor

Pentru introducerea unei matrici ca o lista de elemente


trebuie respectate cateva conventii de baza:

• Elementele unui rand sunt separate de blanc-uri sau


virgule.

• Liniile se separa cu semnul punct si virgula ”;”

• Elementele matricei sunt cuprinse intre paranteze


patrate, ”[ ]”.
Exemple - Definirea matricilor
X =[] - matrice goala
A=[11 22; 33 44 ] A= 11 22
33 44
Vector linie Vl=[1 2 3]
Vector coloana Vc=[1; 2; 3]

Matrice cu numere complexe ( in scrierea nr complexe


spatiile trebuie excluse):

A= [1 2; 3 4]+i[5 6; 7 8] sau
A= [1+5i 2+6i; 3+7i 4+8i ]

Nu folositi i, j ca variabile pentru ca suprascrieti valorile


lor si va trebui sa va generati alte variabile: ii=sqrt(-1).
Numere Random -Definirea matricilor
rand, randn, randi - functii MATLAB buit-in ce pot
genera numere aleatoare.

Funcțiile aceastea nu sunt cu adevărat aleatoare ele sunt


pseudoaleatoare

Pornesc cu un seed, o valoare predeterminată sau una


obținuta din ceasul calculatorului. Un proces determină
următorul „număr aleatoriu“, folosind aceast număr ca
seed este generat un alt număr aleator si tot asa.

Seed din functia rand va fi aceeasi ori de cate ori


MATLAB este pornit – si genereaza “global stream” de
numere aleatore.
Numere Random -Definirea matricilor

Functia rng seteaza un seed initial si-l se poate schimba.


(rng – nu e implementata in Octave)

>> rng('shuffle') % foloseste data si ora ptr a genera seed


>> rng(intseed)
>> rng('default')
Concatenarea matricilor/vectorilor

Operatorul [] permite generarea unor noi matrici/vectori


prin concatenarea unor matrici/vectori deja generate.

[ A,B] - concatenarea pe orizontala a matricilor A cu B,
matricile A si B trebuie sa aiba acelai numar de linii.

[A;B] - concatenarea pe verticala a matricilor A cu B,
matricile A si B trebuie sa aiba acelasi numar de
coloane.

Exemplu: A=[1 2; 3 4] B=[5 6; 7 8] C=[A,B] = [ 1 2 5 6


3 4 7 8]
Concatenarea matricilor/vectorilor
>> help cat
cat (DIM, A, B) permite generarea unor noi
matrici/vectori prin concatenarea unor matrici/vectori
dealungul dimensiunii DIM
cat (2 , A, B) este similar cu [ A,B] - concatenarea pe
orizontala a matricilor A cu B ( matricile A si B trebuie
sa aiba acelai numar de linii) dealungul dimnsiunii 2,
adica cea a coloanelor.
cat (1, A, B) este similar cu [A;B] - concatenarea pe
verticala a matricilor A cu B (matricile A si B trebuie sa
aiba acelasi numar de coloane) dealungul dimnsiunii 1,
adica cea a liniilor.
Exemplu: A=[1 2; 3 4] B=[5 6; 7 8] C=cat(2,A,B) =
[1256
3 4 7 8] D=cat(3,A,B) ?
Concatenarea matricilor/vectorilor

>> help horzcat

horzcat(A1, A2, A3...) – concateneaza pe orizontala lista


de matrici A1, A2, etc ( matricile trebuie sa aiba acelasi
numar de linii)

>> help vertcat

vertcat(A1, A2, A3,...)- concateneaza pe verticala lista de


matrici A1, A2, etc ( matricile trebuie sa aiba acelasi
numar de coloane)
Functii de generare a matricilor de baza
zeros(n,m) - Matrice (n x m) cu toate elementele nule. Daca
matricea e patrata avem zeros(n).

ones(n,m) – Matrice (n x m) cu toate elementele 1. Daca


matricea e patrata avem ones(n).

eye(n) – Matrice unitare de ordinul n, elementele de pe


diagonala principala 1, restul elementelor 0.

diag(v,k) - Matrice banda- vectorul v devine o diagonala


paralela cu diagonala principala aflat la distanta k
deasupra(k>0)sau dedesubtul( k<0) diagonalei
principale iar restul elementelor matricii sunt nule.
Daca k lipseste sau este 0 atunci v va devenii chiar
diagonala principala.
rand(n,m) - Matrice (n x m) cu elemente aleatoare uniform
distribuite.
Generarea vectorilor. Operatorul :

Cu pas liniar v= begin:pas:end



v= vmin : pas : vmax – pas este ratia progresiei
aritmetice din intervalul [vmin,vmax];
nr de elemente= [(vmax –vmin)/pas] + 1
pasul 1 e implicit in Matlab, v= a:b.

v = linspace( vmin, vmax, nr_puncte)

Cu pas logaritmic

v = logspace( vmin, vmax, nr_puncte)
nr de elemente sunt distribuite logaritmic intre
[10vmin, 10vmax].
Accesarea elementelor. Operatorul :

Operatorul : permite accesarea multipla a elementelor


matricilor/vectorilor.

v= A(:) - rearanjarea elementelor matricei A sub forma
v-vector coloana: coloana1, coloana2... ultima

A(1, 1:3) – elemetelor liniei 1, coloanele1,2,3.

A(2:3, :) - elementele liniilor 2 si 3 si toate coloanele

A (i, 1:2:end) – elementele liniei i, coloane impare end
inseamna “pana la sfarsit”

A(A>0) – doar elementele pozitive (elementele ce
indeplinesc conditia logica)
Accesarea elementelor. Operatorul :

Operatorul : permite accesarea multipla a elementelor


matricilor/vectorilor.

>> element = 'oxigen';


>> element(1:3)
>> element(4:end)

Cum trebuie sa scriu să afisez:


>> xgn
dar

>> xige
Accesarea elementelor

Daca se asigneaza o valoare unui element care ocupa o


pozitie in afara dimensiunii maxime a vectorului,
dimensiunea acestuia este marita automat pana la
valoarea indicelui noului element, iar elementele
nedefinite sunt setate la valoarea zero.

Exemplu: x=[7.2457 -1.3345 4.5777 ]


x(2) = -1.3345
x(5) =abs(x(2)) rezulta
x= [7.2457 -1.3345 4.5777 0 1.3345]
Accesarea elementelor

A = diag(5:-1:1)

A(1:3,[1,3,5]) = A(1:3,[1,3,5]) + ones(3,3)

A= 6 0 1 0 1
1 4 1 0 1
1 0 4 0 1
0 0 0 2 0
0 0 0 0 1
Operatii matriceale

Desfasurate dupa regulile calculului matriceal:

Adunarea A+ B
Scaderea A– B
Inmultirea A* B
Impartirea la dreapta A/B este echivalent cu A⋅B-1,
daca B este o matrice patratica inversabila
Impartirea la stânga A\B este echivalent cu A-1⋅B, daca
A este o matrice patratica inversabilă,
Ridicarea la putere A^B, A este matrice patratica si B
scalar sau invers, insa A si B nu pot fi simultan matrice
Transpunerea A' = AT
Operatii cu tablouri
Desfasurate dupa regulile calculului scalar, intre elemente
situate pe aceeasi pozitie. Cu exceptia operatiei de
transpunere, pentru celelalte operatii operanzii trebuie sa
aibe aceleasi dimensiuni sau unul dintre operanzi sa fie
scalar .

Adunarea element cu element +


Scaderea element cu element –
Inmultirea element cu element .*
Impartirea la dreapta element cu element ./
Impartirea la stanga element cu element .\
Ridicarea la putere element cu element .^
Transpunerea element cu element .'
Operatii cu tablouri
>>A=[2 3 0; 1 0 -2; 0 0 3]
>>A+2
ans =

4 5 2
3 2 0
2 2 5

>> a1= A(:,1); a2=A(:,2);


>> s= a1+a2 % rezulta vectorul coloana s=[5 1 0]’
>> p = a1*a2 % eroare – nu au dimensiunea corecta
Operatorul . face inmultirea element cu element
>> p= a1.*a2 % rezulta vectorul coloana p=[6 0 0]’
Cateva functii Matlab pentru calcul matriceal


[n,m] = size(A) – returneaza dimensiunea matricei A:
n- nr de linii si m- nr de coloane

det(A) – returneaza determinantul matricei patratice A

rank(A) – returneaza rangul matricei A

inv(A) – returneaza inversa matricei patratice inversibile
A (inversa unei matrici se calculeaza si asa A^ (-1))

diag(A) – returneaza diagonala principala a matricei A.

conj(A) – returneaza conjugata matricei complexe A
Cateva functii Matlab pentru calcul vectorial


norm(v,p) – returneaza norma p a vectorului v

norm(v)- returneaza norma euclidiana(p=2) a vectorului

dot(v,w) – returneaza produsul scalar al vectorilor de
aceeasi lungime v si w. < u w >= |u| |w| * cos α
;

cross(v,w) – returneaza produsulvectorial al vectorilor v
si w, ( au cate 3 elemente)

sum(v) – returneaza suma elementelor vectorului v

length(v) – returneaza lungimea vectorului v, adica
numarul de elemente
Functii Matlab opereaza pe vectori


Aceste functii opereaza pe vectori (linie sau coloana).
Aplicate pe o matrice (m x n) - matricea interpretata in
maniera coloana x coloana - rezultatul fiind un vector
linie

max, min, sort, sum prod, median, mean, std, any,all

Interpretare linie x linie se obtine folosind transpusa:
exemplu: mean(A')'.
Operatori relationali

Relationali < mai mic


> mai mare
<= mai mic sau egal
>= mai mare sau egal
== egal
~= diferit
Operari logici

A B A&&B A||B ~A XOR(A,B)

0 0 0 0 1 0
1 0 0 1 0 1
0 1 0 1 1 1
1 1 1 1 0 0
Ordinea operatiilor

() % paranteze
‘ ^ % transpusa si ridicare la putere
~ % negatia
* /\ % inmultirea si impartirea
+- % adunarea si scaderea
: % range
< % operatorii relationali
&& % and
|| % or
Operatori relationali si logici
Utilizati la crearea expresiilor logice

Ca date de intrare sunt acceptate doar datele numerice:
-valoarea logica „adevrat” (A) - orice numar diferit de 0
-valoarea logica “fals” (F) - valoarea 0

Datele de iesire nu pot fi decat numerele 1 sau 0,
interpretate ca fiind valorile logice A, respectiv F.

Operatorii relationali pot fi folositi pentru a compara:

a) Doua matrici de aceiasi dimensiune. Rezultatul este


o matrice, compararea se face element cu element.
b) O matrice cu un scalar. Rezultatul este o matrice, iar
compararea se face prin compararea fiecarui element al
matricii cu scalarul dat.
Instructiuni de control logic

Instructiune repetitive cu numar specificat de pasi: for

Instructiune repetitive cu conditie logica: while

Instructiune de decizie, executie conditionata: if, else,
elseif

Instructiune de terminare fortata a unui ciclu: break

Instructiune de returnare a executiei catre functia
apelanta sau catre tastatura: return

Instructiune pentru inchiderea ciclurilor “for”, “while” si
“if”: end
Instructiunea if simpla
Instructiunea if are mai multe forme, cea simpla este :
if expresie_logica
grup de instruciuni;
end

Daca conditia exprimata de expresie_logica este adevarata


se executa grupul de instructiuni si apoi se trece la
executia comenzilor ce urmeaza dupa end.

Daca conditia nu este adevarata se trece la executia


comenzilor de dupa end.

Toate comenzile din grupul de instructiuni trebuie sa


se termine cu ;
Instructiunea if simpla
>> x=2;
>> if x<10
x=x+1;
end
>> x % ce se va afisa ?
function [] =testif (a, b)
if(a < b)
disp(‘ primul numar mai mic ca al doilea numar’ );
disp( [num2str(a) ‘ < ‘ num2str(b)] ) ;
end
>> testif(4,2) % ce se va afisa ?
adaug in corpul functiei
if ( ( a>0) && (b>0) )
disp (‘ambele numere sunt pozitive’);
>> testif(4,2) % ce se va afisa ?
Instructiunea if cu clauza else
Este utilizata cand se doreste executia unui grup de
instructiuni pe conditie adevarata si a altui grup de
instructiuni pe conditie falsa :
if expresie_logica
grup1 de instruciuni;
else
grup2 de instructiuni;
end
Exemplu: >> interval =1.9;
>> if interval<1
x=interval/10;
else
x=0.1;
end
>> x
Instructiunea if cu clauza elseif
Datorita unor conditii complexe, uneori este necesara
imbricarea comenzilor if. Pentru aceste cazuri exista
optiunea elseif: Exemplu:
if conditie1 >>n=7;
grup1 de instruciuni; >>ind=1;
elseif conditie2 >> if n>10
grup2 de instructiuni; ind=10;
elseif conditie3 elseif n>5
grup3 de instructiuni; ind=5;
......................... else
else ind=0;
grupn de instructiuni; end
end >> ind
Instructiunea switch-case
In cazul unor ramificari multiple pentru a preveni scrierea
unor secvente if imbricate complexe se utilizeaza
comanda switch-case:
Exemplu:
switch expresie >>switch punctaj <=10
case valoare1 >>case {9,10}
secventa 1 de comenzi nota = ‘5’;
case valoare2 case 8
secventa 2 de comenzi nota =’4.5’;
……………………………. otherwise
nota = ‘slaba’
otherwise end
secventa n de comenzi >> punctaj =8
end
Instructiunea for
for variabila=expresie
grup de instructiuni;
end
-Daca rezultatul evalurii expresiei este o matrice vida, atunci se sare
direct la prima comanda dupa end fara sa se execute grupul de
instructiuni;
- Daca rezultatul evaluarii expresiei este o matrice cu n coloane,
atunci grupul de instructiuni se va executa de n ori. Variabila va lua
pe rand ca valoare coloana k la executia k si poate fi utilizata cu
aceasta valoare in grupul de instructiuni;
- Daca rezultatul evaluarii expresiei este un vector cu n elemente,
atunci grupul de instructiuni se va executa de n ori, la a k-a executie
variabila luand ca valoare elementul de ordin k din vector;
- Daca rezultatul evaluarii expresiei este un scalar grupul de
instructiuni se va executa o singur data, iar variabila va lua ca
valoare acel scalar;
- Expresia poate fi de forma: k=initial:pas:final;
Instructiunea for imbricata
Exemplu: scrieti o functie care calculeaza n!
function y =fact(n)
y=1;
for ind=1:n
y=y*ind;
end
Apelez functia : >> y=fact(6)
Exemplu:sa se genereze o matrice Hilbert de ordinul 4,ale
carei elemente sunt date de expresia H(a,b)=1/(a+b-1)
n=4;
for a=1:n
for b=1:n
H(a,b) = 1/(a+b-1);
end
end
Instructiunea for
Pentu bucle mari e bine sa pre-alocati spatiu

tic % pornim ceasul


for ii = 1:2000
for jj = 1:2000
A(ii,jj) = ii + jj;
end
end
toc % oprim ceasul % Elapsed time is 12.357 seconds

tic
A = zeros(2000, 2000);
for ii = 1:size(A,1)
for jj = 1:size(A,2)
A(ii,jj) = ii + jj;
end
end
toc % Elapsed time is 2.261 seconds
Instructiunea while
Utilizata pentru repetarea unui set de instructiuni atat timp
cat o conditie specificata este adevarata.
while expresie
grup de instructiuni
end
Exista posibilitatea ca pentru o conditie data sa se cicleze
la infinit. Pentru a evita acest lucru este bine sa
introduceti un numar maxim de iteratii:
it=1;
itmax=1000;
while conditie & (it<itmax)
grup de instructiuni;
it=it+1;
end
Instructiunea while
Exemplu:ghicesc numarul
function[]=ghici(nr)
zic = input(‘Introduceti un nr mai mic ca 10: ’)
if (zic == nr)
disp(‘Felicitari!’)
end
end % trebuie sa rulez de mai multe ori functia

function[]=ghici(nr)
zic = input(‘Introduceti un nr mai mic ca 10: ’)
while (zic ~= nr)
zic = input(‘Introduceti un nr mai mic ca 10: ’)
end
disp(‘Felicitari!’)
end
Instructiunea while

Exemplu:calculeaza suma primelor elemente pozitive ale


vectorului v

function[s]=suma(v)
s=0;
k=1;
l=length(v);
while (v(k)>0)&(k<=l)
s=s+v(k);
k=k+1;
end

end
Instructiunea break
Iesirea fortata dintr-o bucla, inainte de terminarea ei, da
controlul primei comenzi de dupa end-ul buclei - pentru
ciclurile for sau while
Se recomanda a fi utilizata daca o conditie de eroare a fost
detectata
In cazul unor cicluri imbricate comanda iesirea din ciclul
cel mai interior
Exemplu: x = [1 12 NaN 7 8]
>> for ind=1:length(x)
if x(ind)==NaN
break
end
x(ind)=rem(x(ind-1),5);
end
>> x
Instructiunea break
Iesirea fortata dintr-o bucla, inainte de terminarea ei, da
controlul primei comenzi de dupa end-ul buclei - pentru
ciclurile for sau while
Se recomanda a fi utilizata daca o conditie de eroare a fost
detectata
In cazul unor cicluri imbricate comanda iesirea din ciclul
cel mai interior
Exemplu: inlocuiesc elementele vectorului cu restul
impartirii lor la 5 .
>>x = [1 12 NaN 7 8]
>> for ind=1:length(x)
if x(ind)==NaN
breakend
x(ind)=rem(x(ind),5) end
>> x
Exemple
function p=fbreak(v)
% iese fortat din ciclul la intalnirea unui 0 in vector
%daca nu exista elemente nule, treturneaza produsul lor

n=length(v);
p=1;
for k=1:n
if v(k)==0
disp('elemente nule')
break
else
p=p*v(k);
end
end
Exemple

Calculati aceasta suma in doua moduri diferite:


folosind bucla for
folosind indexare
Exemple

Folosim bucla for:

s = 0;
for k = 3:50
s = s + k^2/exp(k);
end
s

Fara bucla for:


x=3:50
sum(x.^2./exp(x))
Exemple
Scrieti functia pentru a calcula suma primilor N+1 termeni a unei
serii geometrice.
gsum=∑ ∞n=0 an = 1/1-a
Cand N -> ∞ suma converge doar daca a<1
Generalizare:
function gsum = geomInf(a,N)
if(N==inf)
if(abs(a)>=1)
error('Serie geometrica divergenta.');
else
gsum=1/(1-a);
end
else
n=0:N;
gsum = sum(a.^n);
end
Try/ Catch
*Se evalueaza o expresie si daca apare o eroare se executa instructiunile
din interiorul blocul catch
* Dupa ce eroarea a fost “catch” se continua executia instructiunilor
dupa end a instructiunii try.
a = 1:5; c=
b = 1:3; 2
for ii = 1:length(a)
try c=
c(ii) = a(ii) + b(ii) 2 4
catch
disp('b is too small') c=
end 2 4 6
end
b is too small
b is too small
b are doar 3 elemente si eroarea apare cand se
incearca accesarea elementelor 4 si 5.
Vectorizarea codului – MATLAB fara bucle !!
MATLAB rapid pe operatii cu vectori si matrici si lent cu bucle!
Exemplu:
an = n, bn = 1000-� n ptr n = 1... 1000. Calculati
psum=∑ 1000n=1 an bn

a = 1:1000; b = 1000 - a;
psum=0;
for n=1:1000 %solutie proasta
psum = psum +a(n)*b(n);
end

Recunoastem ca psum este produsul vectorilor a and b, abT


psum = a*b' %Vectorizarea … solutie buna!

Mai multe informatii despre vectorizare - MathWorks' Code


Vectorization Guide 2
Functii C in MATLAB – MEX files

M files
- ruleaza foarte rapid functiile Built -In in MATLAB

- niciodata nu trebuiesc compilate

- de fiecare data MATLAB interpreteaza fiecare linie din M-files

- procesul este lent pentru functii mari si complicate, in special


pentru cele cu multe bucle →

MATLAB poate rula functii scrise in C - fisierele care contin


codul sursa - fisiere MEX

The mexFunctions nu sunt construite cu scopul de a inlocui


functiile Built-In din MATLAB.
MEX files – interfata cu MATLAB

Legatura dintre functiile Built-In MATLAB si codul C se realizeaza


prin functia mexFunction (similara cu functia main din C)

#include "mex.h" /* Aceasta e obligatorie */


#include "math.h" /*Se pot include orice librarii C necesare */

Intotdeauna functia mexFunction arata asa:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs,


const mxArray *prhs[])
{
% scrieti codul aici *
return;
}
MEX files – interfata cu MATLAB
Sunt 4 parametrii de intrare care corespund apelului de functie
(exemplu [ z0, z1] = vasilica (x,y,z) )

nlhs (type= int) – reprezinta numarul de argumente“ left hand side”.


(nlds =2, corespunzatoare lui z0 si z1)

plhs (type = tablou de pointeri catre mxArray) – acest parametru


este de fapt argumentul de iesire – mxArray este structura MATLAB
care tine datele, fiecare element din plhs tine un mxArray de date.

nrhs(type= int)-reprezinta numarul de argumente“ right hand side”.

prhs (type= const tablou de pointeri catre mxArray) – acest tablou


tine toti pointerii catre tabloul datelor de intare mxArray
(prhs[0] tine tabloul mxArray pentru x, prhs[1] tine tabloul
mxArray pentru y, etc).)
Crearea datelor in MEX files
In MEX-Files structura MATLAB folosita pentru stocarea datelor
este mxArray – aceasta structura poate tine date de tip
real, complex, matrici, siruri de caractere si alte stucturi de date
MATLAB.

In exemplul [z0, z1] = vasilica(x,y,z) presupunem ca


x – matrice 2D, y – sir, z – intreg

Cum extragem si folosim datele ?

Avem acces la parametrul de intrare x printr-un pointer tinut in


tabloul prhs. In C, cand referim un tablou printr-un index, variabila
este automat dereferentiata (ex: nu folosim *).

Pentru claritate vom copia variabila x peste pointerul catre


mxArray si o vom numi xData ( pasul acesta nu e nevoie sa-l faceti
ca sa va mearga codul, il fac doar sa intelegeti mai usor)
Crearea datelor de tip matrice in MEX files
% inauntul functiei mexFunction
% fac declaratii
mxArray *xData;
double *xValues;
int i,j;
int rowLen, colLen;
double avg;

xData = prhs[0]; % copiex pointerul de intare x, in xData


xValues = mxGetPr(xData); % iau matricea x
rowLen = mxGetN(xData); %intoarce un intreg,lungimea liniilor
colLen = mxGetM(xData); %intoarce un intreg,lungimea coloanelor

Functia mxGetPr – obtine un pointer la datele de tip real, xData.


(similar putem folosi functictia mxGetPi pentru date complexe).
Daca traversam matricea liniar, si vrem sa sarim la o anumita pozitie
(a,b) vom scrie codul asa: a*colLen+b – mult mai eficient.
Crearea datelor de tip matrice in MEX files
%inauntul functiei mexFunction

%Printez variabila avg pentru fiecare coloana la consola MATLAB


for(i=0;i<rowLen;i++)
{
avg=0;
for(j=0;j<colLen;j++)
{
avg += xValues[(i*colLen)+j];
%alta metoda ar fi: avg += *xValues++;
}
avg = avg/colLen;
printf("Media liniilor %d, este %d",i,(int)avg);
}
Crearea datelor de tip string in MEX files
Similar pentru a obtine un sir (strings), dar folosind alte functii:

% inauntul functiei mexFunction

mxArray * yData; % declaratii


int yLength;
char *TheString;

yData = prhs[1]; % copiez pointerul de intrare y, in yData

yLength = mxGetN(yData)+1; % fac variabila "TheString" sa


pointeze la un string
TheString = mxCalloc(yLength, sizeof(char)); % mxCalloc este
similar cu malloc din C
mxGetString(yData,TheString,yLength);
Crearea datelor de tip intreg in MEX files

Similar pentru a obtine un intreg, dar folosind alte functii:

% inauntul functiei mexFunction

mxArray *zData; %declaratii


int Num;

zData = prhs[2]; % copiez pointerul de intrare z in zData

Num = (int)(mxGetScalar(zData)); % iau intregul

printf("Intregul meu este: %d",Num); % il printez pe ecran


Exportul datelor in MATLAB
Pentru asignarea datelor/valorile de intoarcere in parametrii de iesire
(left hand side) trebuie sa alocam memorie pentru structurile de
date folosite.
Exemplu cum sa intorc o matrice 2D : intrarea va fi x si va intoarce
in z0, o copie a matricii cu fiecare element din x inmultit cu 2.

%inauntrul functiei mexFunction


mxArray * xData; % declaratii
double *xValues, *outArray;
int i,j;
int rowLen, colLen;

xData = prhs[0]; % copiez pointerul de intrare x

xValues = mxGetPr(xData); % iau matricea


rowLen = mxGetN(xData);
colLen = mxGetM(xData);
Exportul datelor in MATLAB

% Aloc memorie si asignez pointerul de iesire


plhs[0] = mxCreateDoubleMatrix(colLen, rowLen, mxREAL);
%mxReal pentru ca acesta e tipul nostru de date

%iau pointerul datelor in spatiul de memorie nou alocat


outArray = mxGetPr(plhs[0]);

% copiez matricea si multiplic cu 2


for(i=0;i<rowLen;i++)
{
for(j=0;j<colLen;j++)
{
outArray[(i*colLen)+j] = 2*xValues[(i*colLen)+j];
}
}
Apelez functiile Built-In MATLAB din MEX files

Exemplu cum sa folosesc functia MATLAB Built-In z = conv(x,y);

% inauntrul functiei mexFunction

mxArray *rezultat; % declaratii


mxArray *arg[2];

% pun ceva in parametrii de intrare


arg[0] = mxCreateDoubleMatrix(1, 20, mxREAL);
arg[1] = mxCreateDoubleMatrix(1, 10, mxREAL);

%Apelez functia
mexCallMATLAB(1,&rezultat,2,arg,"conv");

Variabila rezultat pointeaza catre mxArray si puteti extrage datele


Apelez functiile Built-In MATLAB din MEX files

Exemplu cum sa folosesc functia MATLAB Built-In z = conv(x,y);

% inauntrul functiei mexFunction

mxArray *rezultat; % declaratii


mxArray *arg[2];

% pun ceva in parametrii de intrare


arg[0] = mxCreateDoubleMatrix(1, 20, mxREAL);
arg[1] = mxCreateDoubleMatrix(1, 10, mxREAL);

%Apelez functia
mexCallMATLAB(1,&rezultat,2,arg,"conv");

Variabila rezultat pointeaza catre mxArray si puteti extrage datele


Compilarea MEX files
Compilarea fisierelor MEX similara cu compilarea cu gcc.

De la command prompt MATLAB (directorul curent trebuie sa fie


locatia fisierului sursa MEX) aplica comanda:
>> mex vasilica.c

MATLAB va va intreba sa alegeti un compilator si va produce


functia [z0,z1] = vasilica(x,y,z) (numele fisierului identic cu numele
functiei)

Dupa compilare MATLAB produce fisierul binar MEX care poate fi


apelat ca o functie built-in MATLAB. Pentru a apela aceasta
functie, trebuie sa fiti in acelasi director cu binarul !

Fisierul binar are diferite extensii depinzand de sistemul de operare


pe care rulati:( ex: Windows=.dll MacOSX=.mexmac
Solaris=.mexsol Linux=.mexlx).
Alte functii utile
Lista completa a functiilor si exemple poate fi gasita MATLAB help

Alte example gasiti si in directorul extern MATLAB


(MATLAB/extern/examples/mx or mex).

mxDuplicateArray
mexErrMsgTxt
mxMalloc
mxRealloc
mxCreateString
mxDestroyArray
mxFree
mxGetCell
mxGetData
…..
Bibliografie


Stormy Attaway, Matlab, A Practical Introduction to
Programming and Problem Solving, 3rd Edition, 2013 Elsevier
Inc.

Calcul numeric-grafica-aplicatii M. Ghinea, V Fireteanu.
Mathlab. Ed. Teora 2001

http://www.mathworks.com/help/pdf_doc/matlab/getstart.pdf

http://www.mathworks.com/academia/student_center/tutorials/la
unchpad.html

Documentatie Octave in format HTML
https://www.gnu.org/software/octave/doc/interpreter/
Bibliografie


Stormy Attaway, Matlab, A Practical Introduction to
Programming and Problem Solving, 3rd Edition, 2013 Elsevier
Inc.

Instructiuni Conditionate
Sumarul de la pagina 136
Exercitiile din capitolul 4 : 1, 6, 10, 16, 27, 30, 31

Bucle
Sumarul de la paina 183
Exercitiile din capitolul 5 : 1, 6, 7, 8, 9, 13, 40
Exercitiile din capitolul 10 : 1, 2, 6, 7

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