Matrici: un’implementazione parametrica in C++

Slides:



Advertisements
Presentazioni simili
BCX (user guide: cineca
Advertisements

Argomenti della lezione
Costruttori e Distruttori
Commenti C#.
Array multidimensionali
Capitolo 8 Array Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl.
MATLAB.
MATLAB.
MATLAB.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
MATLAB.
MultiSet, Liste Ordinate
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Fondamenti di Informatica
Corso di Fondamenti di programmazione a.a.2009/2010
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
RICHIAMI ELEMENTARI DI ALGEBRA MATRICIALE
Costruzione di Interfacce Lezione 11 Dal Java al C++ parte 2
MATLAB.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab m-file m-file script script Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali.
MATLAB.
MATLAB.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Indipendenza lineare,
MATLAB.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Esercizi vari Esercizi.
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
APPUNTI SUL LINGUAGGIO C
Approfondimento delle classi
Dichiarazione di classi Programmazione Corso di laurea in Informatica.
1 laboratorio di calcolo II AA 2003/04 sesta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Lezione IX Laboratorio di Programmazione. Le Classi Una classe C++ è definita come segue: class Nomeclasse { private: // metodi e attrib. visibili solo.
Java base III: Array e Stringhe
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Algoritmi e strutture dati
ARRAY MULTIDIMENDIONALI
Puntatori e gestione dinamica della memoria
Unità Didattica 3 Linguaggio C
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
Programmazione di Calcolatori
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Tipi parametrici Collezioni generiche. Strutture matematiche parametriche.
Corso di Informatica 2 a.a. 2003/04 Lezione 6
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Approfondimenti sulle Classi.
Le variabili in Java Nella programmazione tradizionale, una variabile è una porzione di memoria in cui è immagazzinato un certo tipo di dato. Per esempio.
Strutture dati elementari
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 2 La ricorsione Corso di Informatica 2 a.a. 2003/04 Lezione 2.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 1 Cicli ed asserzioni Corso di Informatica 2 a.a. 2003/04 Lezione 1.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
MATRICI.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Pile e Code.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Ereditarietà in C++
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Oggetti statici e dinamici. Classi annidate. Costruttori/distruttori.
Primo Compitino Primo esercizio Identificare gli errori segnalati dal compilatore Verifica statica del codice Regole di binding per i nomi (quelle.
Metodologie di Programmazione Esercizi sulla semantica di Java.
Esercizio 2. Si mostri l’evoluzione dello stato (ambiente di classi, heap, pila) durante la valutazione delle seguenti dichiarazioni di classe nei punti.
Primo Compitino Terzo Esercizio Implementare il tipo di dato astratto Table un oggetto di tipo Table ha due colonne e un numero variabile di righe.
Lezione sulle allocazioni dinamiche
Quadrati magici tabelle numeriche con particolari curiose proprietà.
30/10/01Array 1  Un array e’ una struttura dati che contiene piu’ valori del medesimo tipo.  La lunghezza di un array e’ stabilita quando l’array viene.
Vettori dinamici Definiremo la classe vector.
Transcript della presentazione:

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

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

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

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

La classe Matrix template <class T> 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<T>&); // costruttre di copia ~Matrix (); // distruttore // altri metodi }; 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) Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10

Un costruttore della classe Matrix template <class T> Matrix<T>::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 j = 0; j < cdim; j++) element[i][j] = initval [cdim * i + j]; } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10

Costruttore di copia template <class T> Matrix<T>::Matrix (const Matrix<T>& 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 j = 0; j < cdim; j++) element[i][j] = m.element[i][j]; } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10

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

Metodi “get”: sono const const assicura che il metodo non altera lo stato template <class T> 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. }; T Matrix<T>::GetEntry (int i, int j) const { assert (1 <= i && i <= row_dim && 1 <= j && j <= col_dim); return element[i - 1][j - 1]; } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10

Sovraccarico degli operatori template <class T> Matrix<T>& Matrix<T>::operator= (const Matrix<T>& 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 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10

La somma di due matrici template <class T> class Matrix { template <class S> friend Matrix<S> operator+ (const Matrix<S>& m1, const Matrix<S> m2); }; template <class S> Matrix<S> operator+ (const Matrix<S>& m1, const Matrix<S> m2) { assert (m1.Row() == m2.Row() && m1.Col() == m2.Col()); Matrix<S> 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; } Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10

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

La stampa di una matrice template <class T> ostream& operator<<(ostream& os, const Matrix<T>& 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 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<int> M (2, 3, init); cout << M; } L’effetto di questa istruzione è analogo alla stampa di un intero 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 cij è definito: Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10

Calcolo del determinante template <class T> T Matrix<T>::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 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10

Vediamo ora il dettaglio dell’istruzione pseudocodificata I minori template <class T> T Matrix<T>::Minor (int i, int j) { Matrix<T> 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 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10

I minori template <class T> T Matrix<T>::Minor (int i, int j) { Matrix<T> 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]; } … Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10

I minori template <class T> T Matrix<T>::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(); Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 10