25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

170 Array<br />

FORALL (i=1:n-1)<br />

FORALL (j=i+1:n)<br />

a(i,j) = a(j,i)<br />

END FORALL<br />

END FORALL<br />

assegna la trasposta della parte triangolare bassa di a alla parte triangolare alta.<br />

Inoltre, un costrutto FORALL può includere un costrutto o un’istruzione WHERE, con il risultato<br />

che ciascuna istruzione di un costrutto WHERE sono eseguite in sequenza. Come si esempio,<br />

si osservi il seguente costrutto:<br />

FORALL (i=1:n)<br />

WHERE (a(i,:)==0) a(i,:)=i<br />

b(i,:) = i/a(i,:)<br />

END FORALL<br />

In questo esempio, ciascun elemento nullo di a viene sostituito dal suo indice di riga e, una volta<br />

completata questa operazione, a tutti gli elementi delle righe di b vengono assegnati i reciproci<br />

dei corrispondenti elementi di a moltiplicati per il corrispondente indice di riga.<br />

Oltre che il costrutto FORALL, il <strong>Fortran</strong> <strong>95</strong> prevede anche una istruzione FORALL, la cui<br />

sintassi è la seguente:<br />

FORALL (ind_1=tripl_1 [,...,espressione_logica]) assegnazione<br />

in cui l’istruzione di assegnazione viene eseguita soltanto per quegli elementi che soddisfino i<br />

parametri di controllo di FORALL.<br />

Validi esempi di istruzioni FORALL sono:<br />

FORALL (i=1:20, j=1:20) a(i,j) = 3*i + j**2<br />

FORALL (i=1:100, j=1:100, (i>=j.AND.x(i,j)/=0)) x(i,j) = 1.0/x(i,j)<br />

Di queste due istruzioni, la prima esegue l’assegnazione:<br />

ai,j = 3 × i + j 2<br />

∀ i, j ∈ {1, . . ., 20}<br />

mentre la seconda sostituisce ciascun elemento non nullo al di sotto della diagonale principale<br />

di x o sulla diagonale stessa con il suo reciproco.<br />

3.15 Gestione di array di grandi dimensioni<br />

Piuttosto che immagazzinare un array di enormi dimensioni, può essere talvolta conveniente la<br />

scelta di ricalcolarne i valori degli elementi tutte le volte che servono. Questa scelta è senz’altro<br />

infruttuosa per quanto concerne la velocità di esecuzione del programma ma potrebbe essere<br />

vantaggiosa in termini di ingombro ”medio” di memoria.<br />

Un’altra soluzione, più efficiente, al problema in esame è l’uso di strutture dati ”impaccate”.<br />

Un esempio è rappresentato dalla gestione di matrici sparse le quali si incontrano assai spesso

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

Saved successfully!

Ooh no, something went wrong!