2013-05-16 14 views

risposta

2

Sì, vedere la risposta High Performance di Marco su come fare questo con la funzione instrinsic PACK.

Se avevo bisogno di eseguire operazioni su tutti gli elementi di matrice che soddisfano alcune condizioni, avrei implementarlo utilizzando una combinazione di DO e IF costrutti, ad esempio:

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 

La gamma (a(i)-eps,a(i)+eps) viene utilizzato soprattutto per prevenire contro il confronto fallire a causa dell'aritmetica in virgola mobile. Se si lavora con numeri interi, verrà eseguito un confronto esatto con ==.

Se sono necessarie solo le operazioni di assegnazione agli elementi di matrice, è possibile ottenere ciò utilizzando i costrutti WHERE o FORALL.

+0

È stato molto utile e chiaro! – marco

+0

di solito, il test è scritto: if (abs (a (i))

7

Dato un array intero tale:

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

allora l'espressione

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

restituirà gli indici degli elementi in testarr pari a 0.

Ti lascio generalizzare o migliorare per trattare numeri reali o per avvolgerlo in una funzione adatta ai tuoi scopi.

Lo standard Fortran 2008 aggiunge una nuova funzione intrinseca findloc che offre la sostituzione per Matlab find che la domanda cerca; il compilatore che uso di più (Intel Fortran 13.1.1) non sembra ancora implementarlo.

+0

+1 Questa è la risposta corretta. – milancurcic

0

La soluzione High Performance Mark basata sul valore intrinseco pack è breve ed elegante. Tuttavia, se la matrice è relativamente piccolo, alla ricerca di un valore specifico con pack tende ad essere più lento di una ricerca di forza bruta sulla base di un ciclo do:

do i = 1, size(testarr) 

    if (testarr(i) == 0) then 

    idx = i 
    exit 

    end if 

end do 

Vedi Craig Finch's answer per i dettagli. Ho anche verificato che il ciclo di forza bruta do è più veloce per i piccoli array (< 10 elementi), rispetto alla ricerca basata su pack.

+1

nota questo trova solo la prima istanza. – agentp

+0

Questo spiegherebbe la sua maggiore velocità! –

Problemi correlati