2013-05-16 4 views

Antwort

2

Ja, siehe Antwort High Performance Mark auf, wie dies zu tun mit der PACK Intrinsic-Funktion.

Wenn I benötigten Operationen auf allen Array-Elemente durchzuführen, die eine Bedingung erfüllen, würde implementieren ich es eine Kombination von DO und IF Konstrukten unter Verwendung von, zum Beispiel:

INTEGER :: i 
REAL,DIMENSION(10) :: a 
REAL :: eps = someSmallNumber 
... 
DO i = 1,SIZE(a) 
    IF(0 > a(i)-eps .AND. 0 < a(i)+eps)THEN 
    ... 
    ENDIF 
ENDDO 

Der Bereich (a(i)-eps,a(i)+eps) wird verwendet oben zu verhindern, gegen Vergleich scheitern aufgrund von Fließkommaarithmetik. Wenn Sie mit Ganzzahlen arbeiten, genügt ein genauer == Vergleich.

Wenn nur Zuweisungsoperationen für Array-Elemente erforderlich sind, können Sie dies mithilfe der Konstrukte WHERE oder FORALL erreichen.

+0

Es war sehr nützlich und klar! – marco

+0

Normalerweise wird der Test geschrieben: if (abs (a (i))

7

ein Integer-Array wie Gegeben:

testarr = [0,1,0,2,0,3,0,4] 

dann den Ausdruck

pack([(ix,ix=1,size(testarr))],testarr==0) 

werden die Indizes der Elemente in testarr gleich 0 zurückzukehren.

Ich überlasse es Ihnen zu verallgemeinern oder zu verbessern, um mit reellen Zahlen umzugehen oder es in eine Funktion für Ihre Zwecke zu verpacken.

Der Fortran 2008-Standard fügt eine neue intrinsische Funktion findloc hinzu, die den Ersatz für Matlabs find anbietet, die die Frage sucht; der Compiler, den ich am meisten verwende (Intel Fortran 13.1.1), scheint das noch nicht zu implementieren.

+0

+1 Dies ist die richtige Antwort. – milancurcic

0

Die Lösung von High Performance Mark basiert auf der pack intrinsischen ist kurz und elegant. Allerdings, wenn Ihr Array relativ klein ist, mit pack für einen bestimmten Wert der Suche neigt als eine Brute-Force-Suche auf eine do Schleife basierend langsamer zu sein:

do i = 1, size(testarr) 

    if (testarr(i) == 0) then 

    idx = i 
    exit 

    end if 

end do 

Siehe Craig Finch's answer für weitere Einzelheiten. Ich habe auch verifiziert, dass Brute Force do Schleife für kleine Arrays (< 10 Elemente), im Vergleich zu der pack basierten Suche schneller ist.

+1

Beachten Sie, dass nur die erste Instanz gefunden wird. – agentp

+0

Das würde für seine größere Geschwindigkeit verantwortlich sein! –

Verwandte Themen