请考虑以下事项:
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)为转置数组创建一个临时数组,这似乎是一种浪费(使用gfortran -O3 -Warray-temporaries -o test test.f90
编译)。另请注意,如果将real
数组“浮动”更改为integer
数组,警告就会消失。
有没有办法在不生成临时数组的情况下(对于任意类型)执行此操作? (我也试过floats(:,:)=transpose(ints)
,因为我读到某个重要的地方......)。它是否与其他编译器一样?
答案 0 :(得分:2)
你可以尝试
floats = transpose(real(ints))
但是如果gfortran(或任何其他编译器)生成一个临时数组来实现它,我不会感到非常惊讶。如果没有,我会更加惊讶。
您也可以尝试
forall (J=1:N, K=1:M) floats(K, J) = real(ints(J, K))
同样,如果编译器创建了一个临时数组来实现它,我也不会感到惊讶。
答案 1 :(得分: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)