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配列「floats」を配列に変更する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 に答える