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) 为转置后的数组创建一个临时数组,这看起来像是一种浪费(使用 编译gfortran -O3 -Warray-temporaries -o test test.f90)。另请注意,如果您将real数组“浮点数”更改为integer数组,警告就会消失。

有没有办法在不生成临时数组的情况下做到这一点(对于任意类型)?(我也尝试过floats(:,:)=transpose(ints),因为我在某处读到它很重要......)。它与其他编译器的行为方式是否相同?

4

2 回答 2

2

你可以试试

floats = transpose(real(ints))

但如果 gfortran(或任何其他编译器)生成一个临时数组来实现它,我不会感到非常惊讶。如果没有,我会更惊讶。

你也可以试试

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

同样,如果编译器创建了一个临时数组来实现它,我也不会感到惊讶。

于 2012-07-25T19:22:37.313 回答
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)
于 2012-07-26T22:40:07.870 回答