2014-09-04 3 views
4

포트란의 고유치 문제를 연구 중입니다. 나는 문제를 풀고 고유치와 고유 벡터를 구하기 위해 Lapack을 사용했다. 이것은 201x101 파동, 대칭으로 인한 파도 공간의 절반, 그리고 대양 (바다에서)의 각 그리드 포인트에 대해 수행됩니다. 각 격자 점에 대해 최대 고유치를 찾고 있는데, 201x101 행렬의 고유 값 행렬에서 절대 최대 값을 선택하는 것이 아니라 웨이브 공간에서 방위각 평균을 수행하고 최대 평균값을 선택하고자합니다. 나는 이것을하는 방법을 보면서 고심하고있다.포트란의 방위각 평균

처음에는 다음과 같이 코딩했습니다.

! 파수 도메인

dx=4000. 
pi = 4.*atan(1.) 
DO m=1,ktot 
    kx(m) = -(2.*pi)/(dx) + ((m-1)*2.*pi)/(100.*dx) 
END DO 

DO l=1,ltot 
    ly(l)= ((l-1)*2.*pi)/(100.*dx) 
END DO 

! 레이디 얼 거리

DO m=1,ktot 
DO l=1,ltot 
    raddist(m,l)=sqrt(kx(m)**2+ly(l)**2) 
END DO 
END DO 

! 방위각 평균

DO i=1,ltot-1 
    ind=(raddist(:,i).GE.ly(i).AND.raddist(:,i).LT.ly(i+1)) 
    length=count(ind) 
    WHERE (ind) average_omegai = sum(omegai)/length 
END DO 

(omegai 제가 발견 고유치는 ktot * ltot 큰 행렬 임)하지만 난 (LY LY (i) 및 사이 K 방향 모두 파수에 대한 수평 청크를 합산하고 보인다 i + 1). 오히려 그 사이의 모든 오메가 (Omegai) 값을 합치려면 파도 공간에서 반원을 만들 필요가 있습니다. 아무도 이것으로 도울 수 있습니까? 미리 감사드립니다 !!

+1

여기서 프로그래밍 문제는 볼 수 없습니다. 알고리즘에 대한 질문입니까? 내가 프로그래밍하기 전에 종이에 알고리즘을 해결하는 것이 좋습니다 것입니다. 일반적으로 인덱싱에 소문자'l'을 사용하는 것은 좋지 않습니다. – milancurcic

+2

scicomp.stackexchange 알고리즘이 더 좋을 것입니다. –

+0

감사합니다. 소문자 L은 어때? 숫자 1처럼 보이거나 실제 문제를 일으킬 수 있습니까? 좋은 습관이 아니면 어쨌든 그것을 바꿀 것입니다! :) 내 문제는 알고리즘이었습니다. 달리 다르게; Fortran에서 몇 가지 기준을 충족하는 매트릭스에서 인덱스를 찾는 다른 방법이 있습니까? Matlab의 find 함수는 작업을 수행 할 수 있지만 Fortran에서 동등한 내장 함수를 찾지 못했습니까? 내 코드는 내가 기대하는 것을 요약하지 못하기 때문에 나는 잘못된 것을하고있다. –

답변

0

먼저 링 내에있는 격자 점의 수는 반지름의 간단한 함수가 아닙니다. 가우스 서클 문제를 참조하십시오. http://mathworld.wolfram.com/GausssCircleProblem.html

둘째, Fortran 90에는 Matlab의 find 함수와 비슷한 명령이 있습니다. where이라고합니다.

희망이 있습니다.