La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Matrici - Ugo de'Liguoro Matrici in C Lezione sulle allocazioni dinamiche.

Presentazioni simili


Presentazione sul tema: "Matrici - Ugo de'Liguoro Matrici in C Lezione sulle allocazioni dinamiche."— Transcript della presentazione:

1 Matrici - Ugo de'Liguoro Matrici in C Lezione sulle allocazioni dinamiche

2 Matrici - Ugo de'Liguoro Matrici con dimensioni fissate Una matrice n  m è un vettore di n elementi, ciascuno dei quali è un vettore di m elementi: dunque è un vettore di vettori: a b c de f g hi l m n a b c d e f g h i l m n

3 Matrici - Ugo de'Liguoro Dichiarazione ed accesso int m[3][4]; causa l’allocazione di un vettore di 3 vettori di 4 interi ciscuno; l’accesso agli elementi della matrice avviene attraverso l’uso di un doppio indice: m[i][j] = 12; Il calcolo dell’indirizzo di m[i][j] è definito dalla formula: &m + i  4  sizeof(int) + j  sizeof(int)  indirizzo del vettore m[i]

4 Matrici - Ugo de'Liguoro Vettori di puntatori Invece di realizzare una matrice con un vettore di vettori si può ricorrere ad un vettore di puntatori: int *m[3]; // crea un vettore di 3 puntatori a intero Quindi occorre allocare i vettori che costituiscono le righe della matrice. Osserviamo: nel caso delle matrici le righe avranno sempre lo stesso numero di elementi, ma in generale non siamo obbligati a questa uniformità. L’accesso (dopo l’allocazione delle righe) è lo stesso che con i vettori di vettori: m[i][j].

5 Matrici - Ugo de'Liguoro Matrici con dimensioni note a run-time typedef int T; typedef struct { int row, col; T** mtr; } Matrix_frm; typedef Matrix_frm* Matrix; Matrix A;

6 Matrici - Ugo de'Liguoro Allocazione di una matrice Matrix MtrCreate(int r, int c, T init) /* genera una matrice r * c, ne inizializza le entrate a init, quindi ritorna il puntatore alla struttura */ { Matrix A; int i, j; A = (Matrix) malloc(sizeof(Matrix_frm)); A->row = r; A->col = c; A->mtr = (T**) malloc(r * sizeof(T*)); for (i = 0; i < r; i++) A->mtr[i] = (T*) malloc(c * sizeof(T)); for (i = 0; i < r; i++) for (j = 0; j < c; j++) A->mtr[i][j] = init; return A; }

7 Matrici - Ugo de'Liguoro A = (Matrix) malloc(sizeof(Matrix_frm)); A->row = r; A->col = c; r c

8 Matrici - Ugo de'Liguoro A->mtr = (T**) malloc(r * sizeof(T*)); A->mtr[i] = (T*) malloc(c * sizeof(T)); r c

9 Matrici - Ugo de'Liguoro Accesso alle matrici dinamiche #define FORMAT "%8.3f" /* formato con max 8 cifre a sinistra e 3 cifre a destra della virgola */ void MtrPrint(Matrix A) /* stampa per righe delle entrate della matrice m */ { int i, j; printf("\n"); for (i = 0; i row; i++) { for (j = 0; j col; j++) printf(FORMAT,A->mtr[i][j]); printf("\n"); }

10 Matrici - Ugo de'Liguoro Matrici sparse Si parla di matrice sparsa quando i valori significativi delle entrate sono molti di meno del numero delle entrate:

11 Matrici - Ugo de'Liguoro Realizzazione di una matrice sparsa 1    45 

12 Matrici - Ugo de'Liguoro Strutture dati e tipi per matrici sparse typedef struct entry { int row; int col; T info; struct entry *next; // punt. al prossimo el. sulla riga } Entry; typedef Entry** SMatrix;

13 Matrici - Ugo de'Liguoro Accesso in lettura T get (SMatrix m, int i, int j) {Entry *p = m[i]; // m e’ un puntatore ad un vettore while ((p != NULL) && (p->col < j)) p = p->next; if ((p == NULL) || (p->col > j)) return 0; else return p->info; }

14 Matrici - Ugo de'Liguoro Accesso in scrittura void Set(Smatrix m, int i, int j, T val) {Entry *q, *t, *p = m[i]; q = p; while ((p != NULL) && (p->col < j)) { q = p; p = p->next; } if ((p == NULL) || (p->col > j) { t = (Entry*) malloc (sizeof(Entry)); t->row = i; t->col = j; t->info = val; t->next = p; if ((m[i] == NULL) || (i == 1)) m[i] = t; else q->next = t; } else p->info = val; }


Scaricare ppt "Matrici - Ugo de'Liguoro Matrici in C Lezione sulle allocazioni dinamiche."

Presentazioni simili


Annunci Google