2012-07-25 2 views
1

다음과 같은 고려 다른 유형의 배열에 할당 할 수있는 방법 : 내가 효율적으로 배열을 전치하고

program main 
integer, parameter :: n=10, m=20 
integer ints(n,m) 
real floats(m,n) 

!... initialize ints 
! ... 

floats=transpose(ints) 
!... do stuff with floats 

end 

이 gfortran에 대한 문서를보고, transpose(ints) 다음 캐스트됩니다 정수 배열을 반환 것으로 보인다 재판에. 이 작업에서 컴파일러 (gfortran)는 transposed 배열에 대해 임시 배열을 만듭니다.이 배열은 낭비처럼 보입니다 ( gfortran -O3 -Warray-temporaries -o test test.f90으로 컴파일). 또한 배열 "floats"를 integer 배열로 변경하면 경고 메시지가 사라집니다.

임시 배열을 생성하지 않고 임의의 유형에 대해이를 수행 할 수있는 방법이 있습니까? (나는 어딘가에 그것이 중요하다고 읽었 기 때문에 floats(:,:)=transpose(ints)도 시도했다.). 다른 컴파일러와 함께 이런 식으로 동작합니까?

답변

2

당신은

floats = transpose(real(ints)) 

을 시도 할 수 있지만, gfortran (또는 다른 컴파일러)이을 구현하기 위해 임시 배열을 생성하면 정말 놀라지 않을 것입니다. 그렇지 않다면 더 놀랄 것입니다.

또한 컴파일러가이를 구현하기 위해 임시 배열을 만든 경우 나는 놀라지 않을 것이다, 다시

forall (J=1:N, K=1:M) floats(K, J) = real(ints(J, K)) 

을 시도 할 수 있습니다. 이 서브 루틴이 아닌 함수가 될해야하지만

+0

나는 당신이 대답하기를 바랬습니다. 첫 번째 파일은 임시 파일을 생성합니다 (gfortran에서). 두 번째는 (또는 적어도 그것에 대해 경고하지 않습니다.) 또한'real (ints (j, k)) '에서'real'을 제거하면 임의의 유형에 대해 작동해야합니다. (주로 정수, 실수 및 배정도의 모든 순열이 필요합니다.) 컴파일러가이 상황에서 배열 임시 변수를 생성해야 할 필요가 있다는 것은 어리석은 생각입니다. 서브 루틴을 사용하고 필요에 따라 오버로드를하는 모듈을 작성할 수는 있지만 어쩌면 순진 할 수도 있습니다. – mgilson

+0

장소 바꾸기는 사소하지 않습니다. 예 : http://en.wikipedia.org/wiki/In-place_matrix_transposition –

+0

@ M.S.B. 나는 그것을 제자리에서하는 것에 대해 이야기하는 것이 아닙니다. 사실, 제 자리에서 그것을하고 싶지 않습니다. (나는'ints'가 변경되기를 원하지 않는다) - 나는 그러나 결과가 가기에 아주 좋은 곳을 가지고있다. 여기서 어려움의 일부는 'transpose'가 일시적인 것이 필요한 더 큰 표현의 일부로 사용될 수 있다는 것입니다. – mgilson

1
do i = 1, n 
do j = 1, m 
    floats(j,i) = real(ints(i,j)) 
enddo 
enddo 

당신은 다른 데이터 유형을 처리하기위한 자신의 transpose 인터페이스를 만들 수 있습니다.

interface transpose_ 
    module procedure transpose_ints_to_reals 
end interface 

subroutine transpose_ints_to_reals(ints_in, reals_out) 
... 
end subroutine 

call transpose_(ints,floats) 
+0

그래, 내가이 일을 할 수 있음을 이해하지만, 나는 그렇게하는 경향이있다. 서로 다른 유형의 동일한 루틴을 여러 번 복제해야합니다. Fortran에 다른 유형의 함수를 자동 생성하고 오버로드하는 메커니즘이 있으면 완벽하지만 AFIK는 그 메커니즘이 존재하지 않습니다. – mgilson

+0

그래, 포트란은 좋은 기능을 많이 가지고 있지 않다. ( – bdforbes

+0

포트란은 숫자를위한 많은 좋은 기능을 가지고있다. 시작하기위한'트랜스 포즈 '기능의 존재는 매우 좋다. – mgilson

관련 문제