25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

172 Array<br />

Così, ad esempio, con riferimento all’esempio precedente si avrebbe ne=13 e<br />

sparsa(1)=nonzero(11,1,1)<br />

sparsa(2)=nonzero(21,2,1)<br />

sparsa(3)=nonzero(11,1,1)<br />

sparsa(4)=nonzero(22,2,2)<br />

sparsa(5)=nonzero(25,2,5)<br />

sparsa(6)=nonzero(32,3,2)<br />

sparsa(7)=nonzero(33,3,3)<br />

sparsa(8)=nonzero(43,4,3)<br />

sparsa(9)=nonzero(45,4,5)<br />

sparsa(10)=nonzero(47,4,7)<br />

sparsa(11)=nonzero(61,6,1)<br />

sparsa(12)=nonzero(62,6,2)<br />

sparsa(13)=nonzero(67,6,7)<br />

E’ importante osservare che per ciascun elemento non nullo della matrice occorre fornire tre<br />

informazioni distinte (il valore dell’elemento e degli indici di riga e di colonna) per cui va<br />

attentamente esaminata l’opportunità di ricorrere a tale tipo di rappresentazione, in particolar<br />

modo quando il numero ne di elementi diversi da zero non soddisfi alla condizione: 3×ne>m×n.<br />

Esistono molti altri modi per comprimere matrici sparse o bandate (come le matrici tridiagonali,<br />

pentadiagonali, etc.) e per tutti gli altri tipi di matrici ”particolari” come quelle<br />

simmetriche o emisimmetriche, unitarie etc. Ad esempio, una matrice quadrata simmetrica A<br />

di ordine m potrà essere rappresentata dai soli elementi Ai,j con i = 1, . . .,m e j = i, . . . , m<br />

ossia mediante i soli elementi della diagonale principale e quelli al di sopra di essa. Si potrà<br />

allo scopo utilizzare un unico vettore a di n = m × (m + 1)/2 elementi secondo la funzione di<br />

accesso:<br />

k = f(i, j, k) = (i − 1) × m + j − 1 + (i − 1) × (i − 2)/2<br />

Tale relazione va applicata per j ≥ i; nel caso in cui, invece, risulti j < i gli indici i e j potranno<br />

essere scambiati essendo la matrice simmetrica. Ad esempio, per m = 4 si riportano gli elementi<br />

della matrice e la relativa posizione:<br />

posizione:<br />

vettore a:<br />

elemento di A:<br />

1 2 3 4 5 6 7 8 9 10<br />

a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) a(9) a(10)<br />

A11 A12 A13 A14 A22 A23 A24 A33 A34 A44<br />

Secondo questo algoritmo, pertanto, l’accesso all’elemento Ai,j avverrà mediante le istruzioni:<br />

IF (j>i) swap(i,j)<br />

k = f(i,j,k)<br />

! istruzioni che coinvolgono a(k)<br />

E’ ovvio che una procedura che operi su matrici immagazzinate in maniera compressa deve<br />

essere in grado di gestire in maniera opportuna la particolare struttura dei dati. Procedure<br />

sviluppate in modo appropriato possono permettere di risparmiare spazio in memoria e tempo

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!