2013-01-21 5 views
1

평평 포트란 행렬에 루핑 : 한마디로I는 다음과 같습니다 코드의 비트가

DO I=0,500 
    arg1((I*54+1):(I*54+54)) = premultz*sinphi(I+1) 
ENDDO 

를, 내가 치수 (54)의 배열 premultz이 내가 원하는 치수 (501)의 배열 sinphi에이 sinphi의 첫 번째 값에 premultz의 모든 항목을 곱하여 arg1의 처음 54 개 항목에 저장 한 다음 sinphi의 두 번째 값에 premultz의 모든 항목을 곱하여 arg1의 second54 항목에 저장하는 등의 작업을 수행합니다. .

평평한 매트릭스입니다. 나는이 프로젝트의 주요 목표 중 하나가 매우 빠른 코드이므로 속도 향상을 위해 그들을 평평하게했다.

제 질문은 이것입니다 : Fortran90에서 이러한 종류의 계산을 코딩하는 더 효율적인 방법이 있습니까? 나는 Fortran이 내가 잘 알지 못하는 배열 조작을 많이하고 있다는 것을 알고있다. 사전에

감사합니다.

답변

0

이 표현, 내가 일을 잘있어 경우는, 또는 당신의 목적에 적합하지 않을 수 있습니다 내가 여기에 크기를 고정 배선 한

arg1 = reshape(spread(premultz,dim=2,ncopies=501)*& 
       &spread(sinphi,dim=1,ncopies=54),[1,54*501]) 

하나 개의 문장에 arg1를 작성해야한다. 내부 식은 외측 곱을 premultzsinphi으로 생성 한 다음 벡터로 다시 형상화합니다. 당신은 바깥 제품의 조바꿈을 바꿀 필요가 있음을 발견 할 수 있습니다.

그러나 Fortran의 배열 내장 함수를 이런 식으로 영리하게 사용 한 경험을 토대로 Fortran의 배열 내장 함수를 영리하게 사용하는 것이 현재 가지고있는 간단한 루프 구현보다 우위에 있음을 확신하지 못합니다. 이러한 작업 중 많은 부분에서 컴파일러는 배열 사본을 생성 할 것이고 데이터 복사는 상대적으로 비용이 많이 듭니다. 물론 이것은 테스트하고 싶을 수있는 주장입니다.

한 줄짜리 코드가 루프보다 더 잘 이해할 수 있는지를 결정 해 드리겠습니다. 때로는 배열 구문의 표현력이 성능면에서 수용 가능한 비용으로 제공되는 경우가 있습니다.

+0

고마워요! 나는 그 기회를 줄 것이다. – user1997417

관련 문제