Esiste una ricca serie di funzioni intrinseche per la manipolazione
degli array che possono far risparmiare molte righe di programmazione
e rendere più chiari i programmi, vediamo le più interessanti:
Funzioni di riduzione di array (il risultato è uno scalare):
- MAXVAL() e MAXLOC() per trovare il valore
massimo e la sua posizione in un array numerico
- MINVAL() e MINLOC() per trovare il valore
minimo e la sua posizione in un array numerico
- PRODUCT() e SUM() per calcolare il prodotto e la
somma di tutti gli elementi di un array numerico
tutte queste funzioni accettano come parametri opzionali (via keyword)
il parametro DIM= (intero scalare), che indica di effettuare
eventualmente l'operazione sulla sola dimensione dell'array
specificata (a partire da 1), e il parametro MASK= (array
logico con la stessa shape dell'argomento) che indica di limitare
l'operazione a quegli elementi dell'array per cui l'argomento di
MASK è .TRUE.
- COUNT() conta gli elementi .TRUE. di una array
logico
- ALL() restituisce .TRUE. se sono .TRUE.
tutti gli elementi di un array logico
- ANY() restituisce .TRUE. se è .TRUE.
almeno un elemento di un array logico
queste funzioni accettano il parametro opzionale DIM= con lo
stesso significato visto sopra.
Altre funzioni di manipolazione degli array:
- PACK() impacchetta gli elementi dell'array
multidimensionale specificato in un array unidimensionale, tenendo
eventualmente conto della maschera fornita con MASK=
- RESHAPE() ridistribuisce gli elementi dell'array
unidimensionale fornito come primo argomento in un array
multidimansionale la cui shape è determinata dal secondo
argomento, anch'esso un vettore unidimensionale; è l'unica maniera per
inizializzare un vettore multidimensionale nella sua dichiarazione in
quanto il costruttore di array gestisce solo array unidimensionali.
Funzioni di algebra lineare:
- DOT_PRODUCT() fa il prodotto scalare
- MATMUL() fa il prodotto matriciale su matrici di rango 2
(attenzione alle dimensioni!)
- TRANSPOSE() traspone una matrice di rango 2.
|
PROGRAM vettori
REAL :: a(12,18), b(18,12), c(12,12)
REAL :: d(3,2) = RESHAPE((/4,5,6, 1,2,3/), (/3,2/))
REAL, PARAMETER :: rmiss = -1.0E15
INTEGER :: n1, n2
READ*,a,b
n1 = COUNT(a /= rmiss)
PRINT*,'Valori validi: ',n1,' Valori mancanti: ',SIZE(a)-n1
IF (n1 > 0) THEN
PRINT*,'Media: ',SUM(a, MASK=(a /= rmiss)) / n1
PRINT*,'Massimo:',MAXVAL(a, MASK=(a /= rmiss))
ENDIF
c = MATMUL(a,b)
END PROGRAM vettori
|