다음과 같은 고려 다른 유형의 배열에 할당 할 수있는 방법 : 내가 효율적으로 배열을 전치하고
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)
도 시도했다.). 다른 컴파일러와 함께 이런 식으로 동작합니까?
나는 당신이 대답하기를 바랬습니다. 첫 번째 파일은 임시 파일을 생성합니다 (gfortran에서). 두 번째는 (또는 적어도 그것에 대해 경고하지 않습니다.) 또한'real (ints (j, k)) '에서'real'을 제거하면 임의의 유형에 대해 작동해야합니다. (주로 정수, 실수 및 배정도의 모든 순열이 필요합니다.) 컴파일러가이 상황에서 배열 임시 변수를 생성해야 할 필요가 있다는 것은 어리석은 생각입니다. 서브 루틴을 사용하고 필요에 따라 오버로드를하는 모듈을 작성할 수는 있지만 어쩌면 순진 할 수도 있습니다. – mgilson
장소 바꾸기는 사소하지 않습니다. 예 : http://en.wikipedia.org/wiki/In-place_matrix_transposition –
@ M.S.B. 나는 그것을 제자리에서하는 것에 대해 이야기하는 것이 아닙니다. 사실, 제 자리에서 그것을하고 싶지 않습니다. (나는'ints'가 변경되기를 원하지 않는다) - 나는 그러나 결과가 가기에 아주 좋은 곳을 가지고있다. 여기서 어려움의 일부는 'transpose'가 일시적인 것이 필요한 더 큰 표현의 일부로 사용될 수 있다는 것입니다. – mgilson