如何有效地转置数组并分配给具有不同类型的数组

时间:2012-07-25 17:44:06

标签: fortran fortran90

请考虑以下事项:

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),因为我读到某个重要的地方......)。它是否与其他编译器一样?

2 个答案:

答案 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)