Array: funzioni intrinseche

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