Konstruktion und Umgestaltung von Feldern

Funktion Beschreibung
arr = reshape ( arr1, arr2, [arr3, arr4] ) Ein gegebenes Feld in ein Feld anderer Form umwandeln.
  • arr1 ... source (Quellfeld)
  • arr2 ... form, Datentyp integer, Größe: 1 bis 7, Festlegung der neuen Feldform
  • arr3 ... pad, Datentyp und kind-Wert wie arr1. Wird verwendet um zusätzliche Felelemente einzufügen.
  • arr4 ... order, Feld der selben Form wie arr2, Datentyp integer. Bestimmt die Anordnung der zusätzlichen Feldelemente.

Der Rückgabewert ist ein Feld, dessen Feldelemente vom gleichen Datentyp und kind-Wert sind wie bei arr1. Die genaue Form dieses Feldes wird durch die Parameter arr2 bestimmt.


Beispiele:

  • integer, dimension(6)  :: a1 = (/ 1, 2, 3, 4, 5, 6 /)
    integer, dimension(3,2) :: a2
    a2 = reshape( a1, (/ 3, 2 /) )
a1
1
2
3
4
5
6
a2 = reshape( a1, (/ 3, 2 /) )
14
25
36
  • integer, dimension(6)  :: a1 = (/ 1, 2, 3, 4, 5, 6 /)
    integer, dimension(4, 2) :: a2, a3
    a2 = reshape( a1, (/ 4, 2 /), (/ 11, 22 /), (/ 1, 2 /) )
    a3 = reshape( a1, (/ 4, 2 /), (/ 11, 22 /), (/ 2, 1 /) )
a1
1
2
3
4
5
6
a2 = reshape( a1, (/ 4, 2 /), (/ 11, 22 /), (/ 1, 2 /) )
15
26
311
422
a3 = reshape( a1, (/ 4, 2 /), (/ 11, 22 /), (/ 2, 1 /) )
14
25
36
1122
arr = merge ( arr1, arr2, arr3 ) Fusioniert die Felder arr1 und arr2 entsprechend der Maske arr3 zu einem neuen Feld.

Werte in arr3:

  • .true. ... Wert aus arr1 wird gewählt
  • .false. ... Wert aus arr2 wird gewählt

Beispiel:

integer, dimension(3, 3) :: a, b
logical, dimension(3, 3) :: mask
a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
b = reshape( (/ -1, -2, -3, -4, -5, -6, -7, -8, -9 /), (/ 3, 3 /) )
mask = reshape( (/ .true., .true., .true., .true., .false., .true., .true., .false., .true. /), (/ 3, 3 /) )
merge( a, b, mask ) ( 1, 2, 3, 4, -5, 6, 7, -8, 9 )
a
147
258
369
b
-1-4-7
-2-5-8
-3-6-9
mask
TTT
TFF
TTT
merge( a, b, mask )
147
2-5-8
369
arr = pack ( arr1, arr2 [, arr3] ) Packt ein Feld arr1 unter Beachtung der Werte einer Maske arr2 in einen Vektor. Die Feldelemente der Maske arr2 müssen logischen Datentyp aufweisen. Optional kann ein Vektor arr3 angegeben werden. Die in der Maske arr2 als .true. gekennzeichneten Feldwerte aus arr1 werden mit diesem Vektor verschmolzen. Das Ergebnis wird zurückgegeben. arr3 soll mindestens soviele Feldelemente aufweisen, wie .true.-Werte in arr2 sind.

Beispiel:

a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
b = (/ -10, -20, -30, -40 /)
mask = reshape( (/ .false., .false., .false., .true., .false., .true., .false., .false., .true. /), (/ 3, 3 /) )
pack( a, mask ) ( 4, 6, 9 )
pack( a, mask, b ) ( 4, 6, 9, -40 )
arr = unpack ( arr1, arr2 , arr3 ) Entpackt den Vektor arr1 unter Beachtung der Werte einer Maske arr2 in ein Feld. Das Ergebnis wird zurückgegeben und weist die Form von arr2 auf, der Datentyp ist der gleiche wie bei arr1.

Beispiel:

integer, dimension(3, 3) :: a
integer, dimension (4) :: b
logical, dimension(3, 3) :: mask
a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
b = (/ -10, -20, -30, -40 /)
mask = reshape( (/ .false., .false., .false., .true., .false., .true., .false., .false., .true. /), (/ 3, 3 /) )
unpack( b, mask, a ) ( 1, 2, 3, -10, 5, -20, 7, 8, -30 )
arr = spread ( arr, i1, i2 ) Vervielfältigung der Feldinhalte in eine zusätzliche Felddimension (i1 ... dim, i2 ... ncopies).

Beispiel:

integer, dimension(2, 2) :: a
integer, dimension(2, 2, 2) :: b
a = reshape( (/ 1, 2, 3, 4 /), (/ 2, 2 /) )
b = spread( a, 3, 2 ) ( 1, 2, 3, 4, 1, 2, 3, 4 )
a
13
24

Abfragen von Feldstatus, Felddaten und Feldmetadaten

Funktion Beschreibung
l = allocated ( arr ) Prüft den Allokationsstatus eines Feldes.

Beispiel:

  • integer, dimension(:), allocatable :: a
    allocate(a(3))
    allocated(a) .true.

Ist Speicherplatz für das abgefragte Feld alloziert, so ist der Rückgabewert .true..

i = lbound ( arr [,i] ) Untere Feldgrenzen. i gibt optional die Felddimension vor, die abgefragt werden soll.

Beispiel:

  • integer, dimension(4:6, 2) :: a = reshape( (/ 1, 2, 3, 4, 5, 6 /), (/ 3, 2 /) )
    lbound (a) ( 4, 1 )
i = ubound ( arr [,i] ) . Obere Feldgrenzen. i gibt optional die Felddimension vor, die abgefragt werden soll.

Beispiel:

  • integer, dimension(4:6, 2) :: a = reshape( (/ 1, 2, 3, 4, 5, 6 /), (/ 3, 2 /) )
    ubound (a) ( 6, 2 )
l = all ( arr [, i] ) Prüft, ob alle Feldelemente .true. sind. Das erste Argument steht für die Abfragemaske (bzw. das Feld mit den Feldelementen vom Datentyp logical), das optionale zweite für die Dimension.

Beispiele:

  • logical, dimension(3) :: a = (/ .true., .false., .true. /)
    all( a ) .false.
  • integer, dimension(3) :: a = (/ -1, 0, 5 /), b = (/ -1, 3, -2 /)
    all( a == b ) .false.
  • logical, dimension(2, 2) :: a = reshape( (/ .true., .false., .false., .false. /), (/ 2, 2 /) )
    all( a, 1 ) ( .false., .false. )

Der Rückgabewert kann ein Skalar oder ein Feld sein.

l = any ( arr [, i] ) Prüft, ob irgend ein Feldelemente .true. ist. Das erste Argument steht für die Abfragemaske (bzw. das Feld mit den Feldelementen vom Datentyp logical), das optionale zweite für die Dimension.

Beispiele:

  • logical, dimension(3) :: a = (/ .true., .false., .true. /)
    any( a ) .true.
  • integer, dimension(3) :: a = (/ -1, 0, 5 /), b = (/ -1, 3, -2 /)
    any( a == b ) .true.
  • logical, dimension(2, 2) :: a = reshape( (/ .true., .false., .false., .false. /), (/ 2, 2 /) )
    any( a, 1 ) (.true., .false.)

Der Rückgabewert kann ein Skalar oder ein Feld sein.

i = count ( arr [, i] ) Zählt die .true.-Elemente in einem Feld. Das erste Argument steht für die Abfragemaske (bzw. das Feld mit den Feldelementen vom Datentyp logical), das optionale zweite für die Dimension.

Beispiel:

  • logical , dimension(3, 2) :: a = reshape( (/ .true., .false., .false., .false., .true., .false. /), (/ 3, 2 /) )
    count( a, 2) (1, 1, 0)

Der Rückgabewert kann ein Skalar oder ein Feld sein.

i = size ( arr [, i] ) Anzahl der Elemente in einem Feld oder einer spezifizierten Dimension. i gibt optional die Felddimension vor, die abgefragt werden soll.

Beispiel:

  • integer, dimension(4:6, 2) :: a = reshape( (/ 1, 2, 3, 4, 5, 6 /), (/ 3, 2 /) )
    size (a) 6
    size (a, 2) 2
arr = shape ( arr ) Form der Feldes arr.

Beispiel:

  • integer, dimension(4:6, 2) :: a = reshape( (/ 1, 2, 3, 4, 5, 6 /), (/ 3, 2 /) )
    shape (a) ( 3, 2 )
ir = minval ( arr [, i] [, l] ) Kleinster Wert im Feld (i ... dim, l ... mask). Die Feldelemente müssen vom Datentyp real oder integer sein.
ir = maxval ( arr [, i] [, l] ) Größter Wert im Feld (i ... dim, l ... mask). Die Feldelemente müssen vom Datentyp real oder integer sein.
i = minloc ( arr [, i] [, l] ) Position des kleinsten Wertes im Feld (i ... dim, l ... mask). Die Feldelemente müssen vom Datentyp real oder integer sein.
i = maxloc ( arr [, i] [, l] ) Position des größten Wertes im Feld (i ... dim, l ... mask). Die Feldelemente müssen vom Datentyp real oder integer sein.

Funktionen für Vektoren und Matrizen

Funktion Beschreibung
arr = dot_product ( arr1, arr2 ) Bildet das Skalarprodukt der beiden Vektoren arr1 und arr2. arr1 und arr2 können Vektoren mit Feldelementen von numerischen oder logischen Datentyp sein.
  • Numerischer Datentyp:
  • Logischer Datentyp:
arr = matmul ( arr1, arr2 ) Matrizenmultiplikation. arr1 und arr2 können Vektoren mit Feldelementen von numerischen oder logischen Datentyp sein.
arr = transpose ( arr1 ) Transponierte Matrix arr1T.

Sonstige

Funktion Beschreibung
arr = cshift ( arr, i1 [, i2] ) Circular shift (i1: shift, i2: dim).

Beispiel:

integer , dimension(3, 3) :: a
a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
cshift( a, 1 ) ( 2, 3, 1, 5, 6, 4, 8, 9, 7 )
cshift( a, 2 ) ( 3, 1, 2, 6, 4, 5, 9, 7, 8 )
cshift( a, 3 ) ( 1, 2, 3, 4, 5, 6, 7, 8, 9 )
cshift( a, 1, 2 ) ( 4, 5, 6, 7, 8, 9, 1, 2, 3 )
cshift( a, 2, 2 ) ( 7, 8, 9, 1, 2, 3, 4, 5, 6 )
cshift( a, (/ 1, 2, -1 /), 1 ) ( 2, 3, 1, 6, 4, 5, 9, 7, 8 )
a
147
258
369
cshift( a, 1 )
258
369
147
cshift( a, 2)
369
147
258
cshift( a, 3 )
147
258
369
cshift( a, 1, 2 )
471
582
693
cshift( a, 2, 2 )
714
825
936
cshift( a, (/ 1, 2, -1 /), 1 )
269
347
158
arr = eoshift ( arr1, i1 [, zlc, i2] ) End-off shift (i1 ... shift, zlc ... boundary, i2 ... dim)

Beispiel:

integer , dimension(3, 3) :: a
a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
eoshift( a, 1 ) ( 2, 3, 0, 5, 6, 0, 8, 9, 0 )
eoshift( a, 2 ) ( 3, 0, 0, 6, 0, 0, 9, 0, 0 )
eoshift( a, 3 ) ( 0, 0, 0, 0, 0, 0, 0, 0, 0 )
eoshift( a, 1, -99 ) ( 2, 3, -99, 5, 6, -99, 8, 9, -99 )
eoshift( a, (/ 1, 2, -1 /), (/ -111, -222, -333 /) ) ( 2, 3, -111, 6, -222, -222, -333, 7, 8 )
eoshift( a, (/ 1, 2, -1 /), 999, 2 ) ( 4, 8, 999, 7, 999, 3, 999, 999, 6 )
eoshift( a, (/ 1, 2, -1 /), 999, 2 )
147
258
369
eoshift( a, 1 )
258
369
000
eoshift( a, 2)
369
000
000
eoshift( a, 3 )
000
000
000
eoshift( a, 1, -99 )
258
369
-99-99-99
eoshift( a, (/ 1, 2, -1 /), (/ -111, -222, -333 /) )
26-333
3-2227
-111-2228
eoshift( a, (/ 1, 2, -1 /), 999, 2 )
47999
8999999
99936
any = sum ( arr [, i] [, l] ) Summe der Feldelemente, bzw. Summe der Feldelemente bei denen die Maskenwerte .true. sind (i ... dim, l ...mask)

Beispiel:

  • integer , dimension(3, 3) :: a
    a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
    sum( a ) 45

Der Rückgabewert kann ein Skalar oder ein Feld sein. Datentyp und kind-Wert sind wie bei arr.

any = product ( arr [, i] [, l] ) Produkt der Feldelemente, bzw. Produkt der Feldelemente bei denen die Maskenwerte .true. sind (i ... dim, l ...mask)

Beispiel:

  • integer , dimension(3, 3) :: a
    a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /) )
    product( a ) 362880

Der Rückgabewert kann ein Skalar oder ein Feld sein. Datentyp und kind-Wert sind wie bei arr.

This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.