Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
Lezione sulle allocazioni dinamiche
Matrici in C Lezione sulle allocazioni dinamiche Matrici - Ugo de'Liguoro
2
Matrici con dimensioni fissate
Una matrice nm è un vettore di n elementi, ciascuno dei quali è un vettore di m elementi: dunque è un vettore di vettori: a b c d e f g h i l m n a b c d e f g h i l m n Matrici - Ugo de'Liguoro
3
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] Matrici - Ugo de'Liguoro
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]. Matrici - Ugo de'Liguoro
5
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; Matrici - Ugo de'Liguoro
6
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 (j = 0; j < c; j++) A->mtr[i][j] = init; return A; } Matrici - Ugo de'Liguoro
7
Matrici - Ugo de'Liguoro
A = (Matrix) malloc(sizeof(Matrix_frm)); r c A->row = r; A->col = c; Matrici - Ugo de'Liguoro
8
Matrici - Ugo de'Liguoro
A->mtr = (T**) malloc(r * sizeof(T*)); r c A->mtr[i] = (T*) malloc(c * sizeof(T)); Matrici - Ugo de'Liguoro
9
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 < A->row; i++) { for (j = 0; j < A-> col; j++) printf(FORMAT,A->mtr[i][j]); } Matrici - Ugo de'Liguoro
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: Matrici - Ugo de'Liguoro
11
Realizzazione di una matrice sparsa
1 1 50 2 1 10 2 4 20 4 1 30 4 3 60 4 4 5 Matrici - Ugo de'Liguoro
12
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; Matrici - Ugo de'Liguoro
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; } Matrici - Ugo de'Liguoro
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; Matrici - Ugo de'Liguoro
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.