La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Matrici: un’implementazione parametrica in C++

Presentazioni simili


Presentazione sul tema: "Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Matrici: un’implementazione parametrica in C++"— Transcript della presentazione:

1 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Matrici: un’implementazione parametrica in C++

2 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 ADT delle matrici Matrice di ordine n  m

3 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 ADT delle matrici Retrive(i, j, M)Post: ritorna a ij in M AssignEntry(i, j, x, M)Post: assegna ad x l’entrata a ij di M Assign(M 1,M 2 )Pre: M 1 ed M 2 hanno lo stesso ordine Post: assegna ad M 1 le entrate di M 2 Add(M 1, M 2 )Pre: M 1 ed M 2 hanno lo stesso ordine Post: ritorna la somma M 1 + M 2 Mult (M 1, M 2 )Pre: M 1 ha ordine n  m, M 2 ha ordine m  p Post: ritorna il prodotto M 1  M 2 di dimensione n  p

4 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Una struttura dati n m  n m

5 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 La classe Matrix template class Matrix { private: int row_dim, col_dim; T** element; public: inline Matrix (); // costruttore di default Matrix (int rdim, int cdim); // costruttore Matrix (int rdim, int cdim, T* initval); // costruttore con inzializzazione delle entrate Matrix (const Matrix &); // costruttre di copia ~Matrix (); // distruttore // altri metodi };

6 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Matrici come vettori di righe/colonne La memoria è unidimensionale: le matrici (con due o più dimensioni) possono essere rappresentate come un vettore di righe (o di colonne)

7 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Un costruttore della classe Matrix template Matrix ::Matrix (int rdim, int cdim, T* initval) // Pre: initval elenca le entrate per riga { row_dim = rdim; col_dim = cdim; element = new T* [row_dim]; for (int i = 0; i < rdim; i++) element[i] = new T [col_dim]; for (int i = 0; i < rdim; i++) for (int j = 0; j < cdim; j++) element[i][j] = initval [cdim * i + j]; }

8 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Costruttore di copia template Matrix ::Matrix (const Matrix & m) { row_dim = m.row_dim; col_dim = m.col_dim; element = new T* [row_dim]; for (int i = 0; i < rdim; i++) element[i] = new T [col_dim]; for (int i = 0; i < rdim; i++) for (int j = 0; j < cdim; j++) element[i][j] = m.element[i][j]; }

9 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Il distruttore template Matrix ::~Matrix () { for (int i = 0; i < row_dim; i++) delete [] element[i]; delete [] element; } Le deallocazioni con delete sono simmetriche alle allocazioni con new

10 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Metodi “get”: sono const template class Matrix { public: // altri metodi inline int Row () const { return row_dim; } inline int Col () const { return col_dim; } T GetEntry (int i, int j) const; // ritorna this[i, j] dove i e j variano da 1 // a n (== row_dim) ed m (== col_dim) risp. }; template T Matrix ::GetEntry (int i, int j) const { assert (1 <= i && i <= row_dim && 1 <= j && j <= col_dim); return element[i - 1][j - 1]; } const assicura che il metodo non altera lo stato

11 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Sovraccarico degli operatori template Matrix & Matrix ::operator= (const Matrix & m) { for (int i = 0; i < row_dim; i++) delete [] element[i]; delete [] element; row_dim = m.row_dim; col_dim = m.col_dim; element = new T* [row_dim]; for (int i = 0; i < rdim; i++) element[i] = new T [col_dim]; for (int i = 0; i < row_dim; i++) for (int j = 0; j < col_dim; j++) element[i][j] = m.element[i][j]; return *this; } Deallocazione dello stato “vecchio” Allocazione del nuovo stato

12 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 La somma di due matrici template class Matrix { template friend Matrix operator+ (const Matrix & m1, const Matrix m2); }; template Matrix operator+ (const Matrix & m1, const Matrix m2) { assert (m1.Row() == m2.Row() && m1.Col() == m2.Col()); Matrix R (m1.Row(), m1.Col()); for (int i = 0; i < m1.Row(); i++) for (int j = 0; j < m1.Col(); j++) R.element[i][j] = m1.element[i][j] + m2.element[i][j]; return R; }

13 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 La stampa di una matrice Template Matrix { //... template friend ostream& operator & m); // invia una stampa di this sullo stream os // (tipicamente cout) };

14 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 La stampa di una matrice template ostream& operator & m) { for (int i = 0; i < m.row_dim; i++) { for (int j = 0; j < m.col_dim; j++) os << ' ' << m.element[i][j]; os << endl; } return os; } os è una sorta di buffer, in cui si accumula il flusso dell’informazione, per poi essere “trasmessa” con return os

15 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 La stampa di una matrice int main() { int init[6] = {1, 2, 3, 4, 5, 6}; Matrix M (2, 3, init); cout << M; } L’effetto di questa istruzione è analogo alla stampa di un intero

16 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Calcolo del determinante Se A è una matrice n  n (con n  2) allora dove il cofattore c ij è definito:

17 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Calcolo del determinante template T Matrix ::Det () { assert(row_dim == col_dim && row_dim >= 2); if (row_dim == 2) return element[0][0]*element[1][1] - element[0][1]*element[1][0]; else { T det = Minor(1,1)*element[0][0]; for (int i = 1; i < row_dim; i++) det += Minor(i+1,1)*element[i][0]; return det; } Minor usa indici da 1 in poi; element da 0 in poi

18 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 I minori template T Matrix ::Minor (int i, int j) { Matrix A (row_dim-1, col_dim-1); copia in A le entrate di this, salvo la riga i e la colonna j if ((i+j) % 2 == 0) return A.Det(); else return - A.Det(); } Vediamo ora il dettaglio dell’istruzione pseudocodificata

19 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 I minori template T Matrix ::Minor (int i, int j) { Matrix A (row_dim-1, col_dim-1); for (int h = 0; h < i-1; h++) { for (int k = 0; k < j-1; k++) A.element[h][k] = element[h][k]; for (int k = j; k < col_dim; k++) A.element[h][k-1] = element[h][k]; } … }

20 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 I minori template T Matrix ::Minor (int i, int j) { … for (int h = i; h < row_dim; h++) { for (int k = 0; k < j-1; k++) A.element[h-1][k] = element[h][k]; for (int k = j; k < col_dim; k++) A.element[h-1][k-1] = element[h][k]; } if ((i+j) % 2 == 0) return A.Det(); else return - A.Det(); }


Scaricare ppt "Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10 Matrici: un’implementazione parametrica in C++"

Presentazioni simili


Annunci Google