Witam,
Otóż w mojej tematyce naukowej wystąpiło następujące zagadnienie. Mam dany zbiór trójek liczb całkowitych postaci (h,k,l). Na te trójki nałożone są pewne warunki, np. f(h,k,l)=f(-h,-k,-l) itp. (gdzie f to jakaś funkcja). Zadaniem jest zatem aby z całego tego zbioru usunąć te niepotrzebne trójki i zostawić tylko te unikalne. Wymyśliłem sobie to następująco:
DO i=1,nreftotA
IF(OBSA(i)==1) THEN
h0=HKLA(i,1); k0=HKLA(i,2); l0=HKLA(i,3)
DO j=i+1,nreftotA
h=HKLA(j,1); k=HKLA(j,2); l=HKLA(j,3)
log1=((h==-h0).AND.(k==-k0).AND.(l==-l0)) ! zmienna logiczna
pglog=log1 ! zmienna logiczna
IF(pglog.EQV..TRUE.) THEN
OBSA(j)=0
END IF
END DO
END IF
END DO
To powyżej to kawałek mojego kodu w FORTRANie. nreftotA to liczba trójek w macierzy HKLA (wymiar nreftotA x 3) i wymiar macierzy OBSA. Jak widać algorytm działa dość prosto:
(1) bierze pierwszą i-tą trójkę która "istnieje" (OBSA(i)=1 dla i-tej trójki)
(2) potem patrzy na wszystkie następne trójki (czyli od j=i+1 to końca)
(3) jeśli dla jakiejś j-tej trójki spełniony jest warunek to wtedy uznaje ją za "nieistniejącą" (stawia OBSA(j)=0)
Algorytm działa super, ale nie dla przypadku jak moja macierz HKLA jest bardzo duża (np. 120 tyś. trójek)... Czy da się to zrobić szybciej i efektywniej jakoś w FORTRANie? Zapewne trzeba by wymyślić inny algorytm czy sposób podejścia...
Z góry wielkie dzięki za pomoc.
Pozdrawiam,
Radek