[ < ] [ globale Übersicht ] [ Kapitelübersicht ] [ Stichwortsuche ] [ > ]

3.3.3 Feldverarbeitung in Fortran90


Da es mit den gängigen Universal-programmiersprachen (welche zum größten Teil für sequentielle Algorithmen auf konventionellen Rechnern entwickelt wurden) nicht möglich ist, die Leistungsfähigkeit von Vektorrechnern voll auszuschöpfen (siehe z.B. Dongarra et al [169] , Ling [277], Sekera [360]) wurden von den Herstellern dieserRechner nichtportable (nicht genormte) Spracherweiterungen von Fortran77 vorgenommen Dadurch können die Möglichkeiten dieser Rechner wesentlich besser ausgenützt werden. Auch in die rechnerunabhängige, genormte Sprachdefinition von Fortran90 wurden viele Elemente dieser rechnerspezifischen Sprache aufgenommen.

Feld-Operationen
In Fortran90 sind die arithmetischen Operationen in elementweiser defintion verfügbar. Z.B: die Operationen C=A+B oder C=A/B sind, unter der Voraussetzung, daß A,B und C Felder gleicher Form sind (z.B Matrizen mit gleicher Zeilen- und Spaltenanzahl ) erlaubt.
Skalare konstanten werden automatisísch zu konstanten Feldern derselben Form ergänzt, sodaß z.B dem Ausdruck 1/Bder äquivalente Ausdruck A/B mit A=(aij)=(1) entspricht

Feld-Aufbau und Teilfeld-Extraktion
Der rekursive aufbau n-dimensionaler Felder aus (n-1) -dimensionalen Feldern oder der Aufbau einer nxn-Matrix aus einer (n-1)x(n-1)Matrix durch hinzufügen eines Zeilen- und eines Spalten- Vektors wird unterstuzt. Die Extraktion von kleineren Feldern aus gegebenen größeren Feldern kann einfach und in natürlicher Weise ausgedruckt werden. die Standardfunktionen sind in Fortran90 auch auf Felder anwendbar; so ist z.B
LOG (A) := (log aij) für das Feld A= (a ij) elementweise definiert

Vordefinierte Funktionen
Das Matrizenprodukt wie auch die Matrix-Transposition sind als vordefinierte Funktion verfügbar. Die Vektot-Operationen stellen einen Teil der Matrix-Algebra dar, wobei jeder Vektor als (nx1)-Matrix interpretiert wird.
Beispiel (Lineares Produkt) In Fortran90 liefert DOT_PRODUCT(vektor_u,vektor_v) das innere Produkt.

uTv :=u1v1+ ... + unvn

zweier Vektoren u und v. Die Feld-Operation vektor_u * vektor_v liefert den Vektor

(u1v1+...unvn)T.

In Fortran90 gibt es zusätzlich zur Matrix-Algebra mit algemeinen, vollbesetzten Matrizen auch spezielle vordefinierte Funktionen für die komprimierte Speicherung von schwach besetzten Matrizen (PACK und UNPACK), jedoch nicht für die Verknüpfung und Manipulation derselben.

Mächtigkeit der Feldoperationen und -funktionen
Auf Grund des hohen Mächtigkeitsgrades der Sprachelemente von Fortran90 zur Feldverarbeitung, kann die Darstellung von Algorithmen zum Teil drastisch verkürzt werden.

Beispiel (Vektor- und Matrixnormen) Für Vektoren und Matrizen liefert der folgende Programmteil verschiedene Normen in einfacher Weise.
REAL, DIMENSION (n) :: x,y
REAL, DIMENSION (n,n) :: a,b
...!VEKTOR-Normen:
x_norm_1 =SUM(ABS(x)) ! Betragssummen-Norm
x_norm_2=SQRT (SUM(x**2)) !Euklidische Norm
x_norm_max=MAXVAL(ABS(x)) !Maximun-Norm
!MATRIX-Normen:
a_norm_1=MAXVAL (SUM(ABS(a), DIM = 1)) !Spaltensummen-Norm
a_norm_max=MAXVAL (SUM(ABS(a), DIM = 2)) !Zeilensummen-Norm
a_norm_f=SQRT (SUM(a**2) !Frobenius-Norm

Beispiel (Statistische Datenauswertung) Die mxn-Matrix T=(tij) enthält Testergebnisse (bewertet durch punkte tij>=0) von m Studenten nach n Tests. Durch die nachstehenden Fortran90 - anweisungen werden verschiedene Auswertungen der Testresultate geliefert.

1. Wie Groß ist die höchste Punktezahl jedes Studenten?
MAXVAL (t, DIM = 2)!Das Ergebnis ist ein Vektor der Länge m.
2. Wieviele Testergebnisse lagen über dem Durchschnitt(gebildet über alle Test und alle Studenten)?
über_dem_durchschnitt = t > SUM (t) /SIZE (t)!Matrix.
anzahl_guter_tests = COUNT (über_dem_durchschnitt)!Skalar
3. Jede Punktezahl, die über dem Durchschnitt liegt, soll um 10% erhöht werden!
WHERE (über_dem_durchschnitt) t = 1.1*t
4. Wie hoch war die Niedrigste Punktezahl aller Ergebnisse, deren Punktewerte über dem Durchschnitt lagen?
min_über_mittel = MINVAL (t, MASK = über_dem_durchschnitt).
5. Gab es mindenstens einen Studenten, dessen Eizelergebnisse(Punkte) alle über dem Durchschnitt lagen?
antwort_logical=ANY (ALL (über_dem_durchschnitt, DIM = 2)).

Beispiel (Chi-Quadrat_Statistik)Aus den beobachteten Häufigkeiten bij und den erwarteten Häufigkeiteneij wird die Größe x2 folgendermaßen definiert:


wobei die Elemente der Matrix E=(eij) durch

gegeben sind. Die Berechnung von x2 leisten vier Fortran90- Anweisungen:

REAL, DIMENSION::chi_quadrat
REAL, DIMENSION (m,n)a :: b, e
REAL, DIMENSION (m )a :: r
REAL, DIMENSION (n ) :: c
...
r=SUM(b, DIM = 2)
c=SUM(b, DIM = 1)
e=SPREAD(r, DIM=2, NCOPIES=n) * SPREAD(c, DIM =1, NCOPIES=m) / SUM(b)
chi_quadrat = SUM (((b - e ) **2) /e)


[ < ] [ globale Übersicht ] [ Kapitelübersicht ] [ Stichwortsuche ] [ > ]
Manuel Malaver