次のことを考慮してください。
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
配列「floats」を配列に変更するinteger
と、警告が消えることにも注意してください。
一時配列を生成せずに(任意のタイプに対して)これを行う方法はありますか?floats(:,:)=transpose(ints)
(私はそれが重要であるとどこかで読んだので私も試しました...)。他のコンパイラでもこのように動作しますか?