2013-05-16 9 views

Odpowiedz

2

Tak, patrz odpowiedź High Performance Marka, w jaki sposób to zrobić zz instrinsic funkcji PACK.

Jeśli potrzebne do wykonywania operacji wszystkich elementów macierzy, które spełniają pewne warunki, by implementować że stosując kombinację DO i IF konstrukcji, na przykład:

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 

Zakres (a(i)-eps,a(i)+eps) stosuje się wyżej zapobiec przed porównaniem nie działa z powodu arytmetyki zmiennoprzecinkowej. Jeśli pracujesz z liczbami całkowitymi, zrobi to dokładne porównanie ==.

Jeśli potrzebne są tylko operacje przypisania do elementów tablicy, można to osiągnąć, używając konstruktów WHERE lub FORALL.

+0

To było bardzo przydatne i jasne! – marco

+0

zwykle test jest zapisywany: if (abs (a (i))

7

względu tablicę liczb, takich jak:

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

następnie ekspresji

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

powróci indeksów elementów w testarr równych 0.

Zostawię was do uogólnienia lub ulepszenia tego, aby poradzić sobie z liczbami rzeczywistymi lub zawinąć je w funkcję, która będzie odpowiadać waszym celom.

Standard Fortran 2008 dodaje nową wewnętrzną funkcję findloc, która stanowi zamiennik dla Matlab's find, której dotyczy pytanie; kompilator, którego używam najbardziej (Intel Fortran 13.1.1) nie wydaje się jeszcze tego implementować.

+0

+1 To jest poprawna odpowiedź. – milancurcic

0

Wysokowydajne rozwiązanie Mark oparte na wewnętrznym wzorze pack jest krótkie i eleganckie. Jednakże, jeśli tablica jest stosunkowo mały, szukając określonej wartości z pack wydaje się być wolniejszy niż brutalnej siły wyszukiwania w oparciu o do pętli:

do i = 1, size(testarr) 

    if (testarr(i) == 0) then 

    idx = i 
    exit 

    end if 

end do 

Zobacz Craig Finch's answer szczegóły. Zweryfikowałem również, że pętla brute force jest szybsza w przypadku małych macierzy (< 10 elementów) w porównaniu z wyszukiwaniem opartym na pack.

+1

uwaga ta znajduje tylko pierwszą instancję. – agentp

+0

To by wyjaśniało większą prędkość! –

Powiązane problemy