Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Proceduri de calcul

c


Proceduri de calcul

Aceasta categorie de proceduri se refera la operatiile cu matrice. Aici sunt incluse adunarea a doua matrice, înmultirea a doua matrice, transpunerea unei matrice, diferenta dintre doua matrice, inversa unei matrice. Tot în aceasta categorie de proceduri autorii au inclus si operatiile de adunare, scadere, înmultire si transpunere cu matrice vectorizate. De exemplu, suma a doua matrice vectorizate presupune transformarea matricelor în vectori, suma efectuându-se acum între doi vectori. Analog se realizeaza si scaderea, înmultirea si transpunerea matricei.



În continuare se prezinta procedurile care realizeaza operatiile specificate mai sus, precum si paralela între modul de lucru cu o matrice alocata static si una alocata dinamic.

Operatia de înmultire a doua matrice este realizata în doua moduri:

prin functia

multiplyng( n1, m1, x, n2, m2, y, z,*n3, *m3)din cadrul bibliotecii matrice.h;

prin supraâncarcarea operatorului "*" în cadrul clasei matrix.

Functia void multiplyng(int n1,int m1,int x[30][30],int n2,int m2,int y[30][30],int z[30][30],int *n3,int *m3) realizeaza înmultirea a doua matrice rezultatul fiind obtinut într-o a treia matrice. Parametrii functiei sunt urmatorii:

int n1,m1- parametrii de intrare; 959b14j reprezinta numarul de linii, respectiv numarul de coloane ale matricei x;

int n2,m2- parametrii de intrare; 959b14j reprezinta numarul de linii, respectiv numarul de coloane ale matricei y;

int x[30][30],y[30][30]­- parametrii de intrare; 959b14j reprezinta matricele care vor fi înmultite;

int z[30][30]-parametru de iesire si reprezinta matricea rezultat al înmultirii celor doua matrice;

int n3,m3- parametrii de iesire; reprezinta numarul de linii, respectiv numarul de coloane ale matricei rezultat z. Transferul acestor parametrii se face prin valoare.

Secventa care realizeaza înmultirea celor doua matrice este urmatoarea:

eror=1;

if(m1! =n2) eror=0;

else

}

if (eror==0) printf("\n Multiplyng is not posible!");

else

Dupa cum se stie înmultirea a doua matrice se realizeaza decât daca numarul de coloane a primei matrice este egal cu numarul de linii a celei de-a doua. În functia prezentata mai sus în cazul în care nu este îndeplinita aceasta conditie se afiseaza mesajul Multiplyng is not posible!.

În clasa matrix operatia de înmultire s-a realizat prin supraâncarcarea operatorului "*". Supraâncarcarea a fost realizata astfel:

matrix matrix::operator*(matrix b)

}

return c;

Procedura de supraâncarcare întoarce un obiect de tip matrix si anume rezultatul înmultirii celor doua matrice, care este creat în interiorul procedurii( obiectul c). Ea primeste ca parametru de intrare un obiect de tip matrix si anume obiectul b. El reprezinta operandul din partea dreapta a înmultirii. Operandul stâng al înmultirii este dat de pionterul this. Ca si în cazul functiei din cadrul bibliotecii matrice.h si în cadrul procedurii de supraâncarcare se face testul de validitate a înmultirii. Alocarea memorie pentru matricea rezultat c este realizata în momentul apelarii constructorului cu parametrii(matrix c(n,b.m)).

Suma a doua matrice este realizata în cadrul bibliotecii matrice.h si are denumirea adding(n1,m1,x,n2,m2,y,*n3,*m3,z). Ea are ca parametrii urmatoarele variabile:

int n1,m1- parametrii de intrare; 959b14j ei reprezinta dimensiunile matricei x(n1 numarul de linii, m1 numarul de coloane);

int n2,m2- parametrii de intrare; 959b14j ei reprezinta dimensiunile matricei y;

int x[30][30],y[30][30]- parametrii de intrare; 959b14j ei reprezinta matricele care sunt adunate;

int *n3,*m3- parametrii de iesire; reprezinta dimensiunile matricei rezultat al adunarii matricei x cu matricea y(numarul de linii, respectiv numarul de coloane);

int z[30][30]- parametru de iesire si reprezinta matricea în care este pus rezultatul adunarii celor doua matrice.

Secventa de program care realizeaza suma celor doua matrice este urmatoarea:

eror=1;

if((n1!=n2)|(m1!=m2)) eror=0;

else

if (eror==0) printf("\n Adding is not posible!");

else

Ca si la înmultire la adunarea trebuie facut testul de validitate a sumei, adica numarul de linii si de coloane al celor doua matrice trebuie sa fie egal. În caz contrar se afiseaza urmatorul mesaj Adding is not posible!

Operatia de adunare este realizata în cadrul clasei matrix prin supraâncarcarea operatorului "+". Aceasta s-a realizat astfel:

matrix matrix::operator +(matrix b)

return c;

Procedura primeste ca parametrii de intrare pionterul this si un obiect de tip matrix si anume b. Rezultatul adunarii este pus în obiectul c. Procedura este de tip matrix si întoarce astfel obiectul c. Ca si la înmultire pointerul this este operandul stâng al adunarii, iar obiectul de tip matrix, b este operandul drept al operatiei.

Diferenta a doua matrice este realizata în cadrul bibliotecii matrice.h si are denumirea substracting(n1,m1,x,n2,m2,y,*n3,*m3,z). Ea are ca parametrii urmatoarele variabile:

int n1,m1- parametrii de intrare; 959b14j ei reprezinta dimensiunile matricei x(n1 numarul de linii, m1 numarul de coloane);

int n2,m2- parametrii de intrare; 959b14j ei reprezinta dimensiunile matricei y;

int x[30][30],y[30][30]- parametrii de intrare; 959b14j ei reprezinta matricele ale caror diferenta este efectuata ;

int *n3,*m3- parametrii de iesire; reprezinta dimensiunile matricei rezultat al diferentei matricei x cu matricea y(numarul de linii, respectiv numarul de coloane);

int z[30][30]- parametru de iesire si reprezinta matricea în care este pus rezultatul scaderii celor doua matrice.

Secventa de program care realizeaza diferenta celor doua matrice este urmatoarea:

eror=1;

if((n1!=n2)|(m1!=m2)) eror=0;

else

if (eror==0) printf("\n Substracting is not posible!");

else

Ca si la înmultire la scadere trebuie facut testul de validitate a sumei, adica numarul de linii si de coloane al celor doua matrice trebuie sa fie egal. În caz contrar se afiseaza urmatorul mesaj Substracting is not posible!

Operatia de scadere este realizata în cadrul clasei matrix prin supraâncarcarea operatorului "-". Aceasta s-a realizat astfel:

matrix matrix::operator -(matrix b)

return c;

Procedura primeste ca parametrii de intrare pionterul this si un obiect de tip matrix si anume b. Rezultatul scaderii este pus în obiectul c. Procedura este de tip matrix si întoarce astfel obiectul c. Ca si la înmultire pointerul this este operandul stâng al diferentei, iar obiectul de tip matrix, b este operandul drept al operatiei de scadere.

Operatia de transpunere a unei matrice este realizata în doua moduri:

prin functia transpose( n, m, x, *n1, *m1, y)din cadrul bibliotecii matrice.h;

prin supraâncarcarea operatorului "!" în cadrul clasei matrix.

Functia void transpose(int n,int m,int x[30][30],int *n1,int *m1,int y[30][30]) realizeaza transpunerea unei matrice rezultatul fiind obtinut în alta matrice. Parametrii functiei sunt urmatorii:

int n,m- parametrii de intrare; 959b14j reprezinta numarul de linii, respectiv numarul de coloane ale matricei x;

int x[30][30]- parametru de intrare si reprezinta matricea care este transpusa;

int *n1,*m1- parametrii de iesire; reprezinta numarul de linii, respectiv numarul de coloane ale matricei x transpunse si anume a matricei y. Transferul se face prin valoare;

int y[30][30]-parametru de iesire si reprezinta matricea rezultat al transpunerii matricei;

Secventa care realizeaza transpunerea matricei x este urmatoare:

for(i=0;i<n;i++)

for(j=0;j<m;j++)

y[j][i]=x[i][j];

*n1=m;

*m1=n;

În clasa matrix operatia de transpunere s-a realizat prin supraâncarcarea operatorului "!". Supraâncarcarea a fost realizata astfel:

matrix matrix::operator!()

Procedura de supraâncarcare întoarce un obiect de tip matrix si anume rezultatul transpunerii matricei, care este creat în interiorul procedurii( obiectul b). Ea primeste ca parametru de intrare un pointer la un obiect de tip matrix si anume pointerul this. El reprezinta operandul din partea dreapta a transpunerii. Alocarea memorie pentru matricea rezultat c este realizata în momentul apelarii constructorului cu parametrii(matrix b(n,m)).

O mare aplicabilitate o are si vectorizarea unei matrice. Aceasta s-a concretizat prin functia void matrix_line(int a[30][30],int n,int m,int x[],int *k) din cadrul bibliotecii matrice.h.

Aceasta functiei preia o matrice si o transforma într-un vector de n*m+2 componente. Traversarea matricei se face pe linii, deci în vector vor fi regasite elementele matricei ca si când am cap la cap fiecare linie. Dimensiunea vectorului este cu doua componente mai mare decât numarul de elemente ale matricei deoarece pe ultimele doua pozitii se pastreaza numarul de linii, respectiv numarul de coloane ale matricei. Este importanta pastrarea dimensiunilor matricei pentru o eventuala operatie inversa( de la vector la matrice) sau pentru operatiile de adunare, scadere, transpunere si înmultire cu matrice vectorizate.

Functia primeste urmatorii parametrii:

int a[30][30]­- parametru de intrare si reprezinta matricea care este vectorizata;

int n,m- parametrii de intrare; 959b14j reprezinta dimensiunile matricei a;

int x[]- parametru de iesire si reprezinta vectorul în care este transformata matricea a;

int *k- parametru de iesire si reprezinta dimensiunea vectorului x. Transferul se face prin valoare.

Functia are urmatoarea structura:

void matrix_line(int a[30][30], int n, int m, int x[], int *k)

x[*k]=n;

(*k)++;

x[*k]=m;

(*k)=(n*m)+2;

}

În clasa matrix functia care realizeaza vectorizarea unei matrice se numeste matrix_line. Ea are urmatoarea forma int* matrix_line(int &k). Functia este functie membra a clasei si are tipul int* returnând asadar un vector. Spre deosebire de functia matrix_line din biblioteca matrice.h în functia membra clasei atât vectorul cât si matricea sunt declarate dinamic. Asta presupune alocarea memorie în interiorul functiei pentru vectorul rezultant.

Functia este urmatoarea:

int*matrix:: matrix_line( int *k)

x[*k]=n;

(*k)++;

x[*k]=m;

(*k)=(n*m)+2;

return x;

}

Pentru a întelege mai bine algoritmul, consider urmatorul masiv de 3 linii si 3 coloane:

Deci aceasta este matricea. În urma apelarii functiei matrix_line fie din biblioteca matrice.h, fie din clasa matrix se obtine urmatorul vector:

1 2 3 4 5 6 7 8 9 3 3

Dupa cum se observa apar doua componente diferite de elementele matricei. Ele reprezinta dimensiunile matricei si vor întotdeauna memorate pe ultimele doua pozitii din vector, de unde si dimensiunea 3*3+2 componente.

Suma a doua matrice vectorizate a fost de asemenea realizata în doua moduri:

matricele vectorizate sunt pointeri constanti, varianta din biblioteca matrice.h;

matricele vectorizate sunt pointeri variabili, varianta din clasa matrix.

Prima varianta s-a concretizat prin functia void add_line_matr(int x[],int l1,int y[],int l2,int z[],int *k).

Functia primeste urmatorii parametrii:

int x[]­,y[]- parametri de intrare si reprezinta matricele vectorizate care vor fi însumate;

int l1,l2- parametrii de intrare; 959b14j reprezinta dimensiunile matricei vectorizate x, respectiv a matricei vectorizate y;

int z[]- parametru de iesire si reprezinta vectorul în care vor fi însumate cele doua matrice;

int *k- parametru de iesire si reprezinta dimensiunea vectorului z. Transferul se face prin valoare.

Functia are urmatoarea structura:

void add_line_matr(int x[],int l1,int y[],int l2,int z[],int *k)

În clasa matrix functia care realizeaza însumarea a doua matrice vectorizate se numeste row_matrix_elem_sum. Ea are urmatoarea forma int* row_matrix_elem_sum( matrix ,int *,int *,int *). Functia este functie membra a clasei si are tipul int* returnând asadar un vector. Spre deosebire de functia add_line_matr din biblioteca matrice.h în functia membra clasei atât vectorul cât si matricea sunt declarate dinamic. Asta presupune alocarea memorie în interiorul functiei pentru vectorul rezultant.

Functia primeste urmatorii parametrii:

parametrii de intrare- this, matrix b, int *x, int *y; ei reprezinta matricele care au fost vectorizate, respectiv vectorii în care au fost transformate;

parametrii de iesire- int *k care reprezinta dimensiunea vectorului rezultat al adunarii vectorilor x si y.

Aceasta este functia:

int * matrix::row_matrix_elem_sum( matrix b,int *x,int *y,int *k)

return z;

}

Avem urmatorul exemplu:

A= B=

Dupa vectorizare se obtine :X=2 12 3 1 2 2

Y= 56 4 43 5 2 2

Dupa apelarea functiei add_line_matr(x,6,y,6,z,&k) se obtine matricea vectorizata Z=58 16 46 6 2 2

Operatia de scadere este realizata prin functiile void substr_line_matr (int x[],int l1,int y[],int l2,int z[],int k) din matrice.h si int*matrix::row_matrix_elem_substr( matrix b,int *x,int *y,int *k) din clasa matrix. Explicatiile sunt identice ca la operatia de adunare. Functiile sunt prezentate în anexa de la sfârsitul lucrarii.

Înmultirea a doua matrice vectorizate alocate static se realizeaza prin procedura void multiply_line_matr(int x[],int l1,int y[],int l2,int z[],int *k). Functia primeste urmatorii parametrii:

int x[]­,y[]- parametri de intrare si reprezinta matricele vectorizate care vor fi înmultite;

int l1,l2- parametrii de intrare; 959b14j reprezinta dimensiunile matricei vectorizate x, respectiv a matricei vectorizate y;

int z[]- parametru de iesire si reprezinta vectorul în care vor fi înmultite cele doua matrice;

int *k- parametru de iesire si reprezinta dimensiunea vectorului z. Transferul se face prin valoare.

Functia are urmatoarea structura:

void multiply_line_matr(int x[],int l1,int y[],int l2,int z[],int *k)

vb1=0;

while ((vb1*lineB)!=(lineB*columnB))

vb1++;

(*k)++;

}

vb++;

}

z[*k]=lineA;

(*k)++;

z[*k]=columnB;

*k=columnB*lineA+2;

}

else *k=0;

Este necesara retransformarea în matrice a vectorului y. Aceasta se realizeaza cu functia:

void line_matrix(int x[],int l,int a[30][30],int *n,int *m)

Dupa aceasta transformare vom vectoriza matricea matrix obtinuta anterior prin apelarea functiei line_matrix(y,l2,matrix,&q,&r). Aceasta vectorizare este de fapt o transpunere a matricei matrix. Operatia se realizeaza cu functia void matrix_line_top(int a[30][30],int n,int m,int x[],int *k). Sau realizat aceste operatii pentru a usura înmultirea efectiva a celor doua matrice vectorizate.

Algoritmul este simplu, folosindu-se variabilele vb si vb1 pentru a sti când se termina componentele matricei. Altfel exista riscul de înmulti si ultimele doua pozitii ale vectorilor.

Tot cu ajutorul acestor variabile se disting liniile si coloanele matricelor transpuse în vectorii x, respectiv y. Acest lucru este necesar pentru a obtine rezultatul dorit si anume o matrice sub forma vectoriala. Variabilele lineA, columnA sunt folosite pentru pastra numarul de linii, respectiv numarul de coloane al matricei transformate în vectorul x. Analog variabilele lineB, respectiv columnB.

În clasa matrix înmultirea a fost realizata în functia int * row_matrix_elem_multpl(matrix b,int *x,int *y,int k). Pentru a evita folosirea a multor variabile s-a folosit ca parametrii de intrare si cele doua matrice( pointerul this si matrix b), precum si vectorii în care au fost transformate int * x, respectiv int *y. Algoritmul este acelasi cu cel al functiei multiply_line_matr, cu mentiunea ca în clasa matrix vectorii sunt declarati dinamic si de aceea este necesara alocarea spatiului necesar fiecaruia.

Functia membra clasei este urmatoarea:

int * matrix::row_matrix_elem_multpl(matrix b,int *x,int *y,int *k)

vb1=0;

while ((vb1*b.n)!=(b.n*b.m))

vb1++;

(*k)++;

}

vb++;

}

z[*k]=n;

(*k)++;

z[*k]=b.m;

*k=b.m*n+2;

}

else *k=0;

return z;

}

Transpusa unei matrice vectorizate a fost folosita de fapt în functia de înmultire pentru a usura munca. Functia este urmatoarea:

void transpose_line_matrix(int x[],int k,int *z,int *l1)

Functia membra a clasei matrix este de tip int* si returneaza astfel vectorul obtinut în urma transpunerii matricei vectorizate. Ea mai primeste ca parametru de intrare decât matricea vectorizata si dimensiunea vectorului. Functia este urmatoarea:

int * matrix::row_matrix_elem_transpose(int *x,int *k)

Cum declararea variabilelor s-a facut dinamic apare necesitatea alocarii spatiului de memorie pentru vectorul rezultat. Alocarea memorie se face prin intermediul functiei membre cu acces privat aloc_vec(int, int). Aceasta functie este urmatoarea:

int* matrix::aloc_vec(int n,int m)

Aloca spatiul de memorie pentru un vector de dimensiunea n*m+2.

Datorita necesitatilor ulterioare sunt incluse în biblioteca matrice.h si functiile creation_float(&n,&m,x), creating_unit_float(n,m,x) si show_matrix_float(n,m,x). Diferenta dintre functiile prezentate mai sus si functiile din acest capitol consta în faptul ca tipul elementelor matricei nu este întreg. Matricea este declarata astfel: float x[30][30].

Asadar comentariile pentru aceste functii sunt identice cu cele corespondente functiilor prezentate în acest capitol( masivul are elemente întregi).

Aceste functii prezentate mai sus au fost grupul procedurilor de calcul care vor fi utilizate în capitolele urmatoarea pentru a exemplifica aplicabilitatea calculului matriceal.



Document Info


Accesari: 1888
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )