Fortran(transpose)

旧2-5. Fortran毎日学習

Fortranでtransposeを使います。transposeは、Rubyにもありますね。Fortranを参考にしたのでしょうか。
Ruby(irb)でtransposeを使ってみます。

takk@deb9:~$ irb
irb(main):001:0> a=Array.new(2,Array.new(3))
=> [[nil, nil, nil], [nil, nil, nil]]
irb(main):002:0> a.transpose()
=> [[nil, nil], [nil, nil], [nil, nil]]
irb(main):003:0>

2×3の配列が、3×2の配列に転換されました。引数がいらないので簡単に使えますね。
次はFortranのtransposeを使ってみます。

takk@deb9:~$ cat func-transpose.f90
      program main
        integer a(2,5)

        write(*,*) shape(a)
        write(*,*) shape(transpose(a))

        stop
      end
takk@deb9:~$

配列の形状を比較して確認したいのでshapeを表示するプログラムにしました。
実行してみます。

takk@deb9:~$ gfortran func-transpose.f90
takk@deb9:~$ ./a.out
           2           5
           5           2
takk@deb9:~$

2×5の配列が、5×2になりました。Rubyと同じく簡単でしたね。
次に気になるのが、次元数を増やすとどうなるか。三次元の配列で確認してみましょう。

takk@deb9:~$ cat func-transpose-2.f90
      program main
        integer a(2,3,4)

        write(*,*) shape(a)
        write(*,*) shape(transpose(a))

        stop
      end
takk@deb9:~$

ビルドします。

takk@deb9:~$ gfortran func-transpose-2.f90
func-transpose-2.f90:5:35:

         write(*,*) shape(transpose(a))
                                   1
Error: ‘matrix’ argument of ‘transpose’ intrinsic at (1) must be of rank 2
takk@deb9:~$

ビルドエラーになりました。二次元配列が対象なんですね。
Rubyの方はどうでしょう。

irb(main):001:0> a=Array.new(1,Array.new(2,Array.new(3)))
=> [[[nil, nil, nil], [nil, nil, nil]]]
irb(main):002:0> a.transpose()
=> [[[nil, nil, nil]], [[nil, nil, nil]]]
irb(main):003:0>

こちらは、転換されたようです。一次元と二次元が入れ替わりました。
さらに四次元配列で確認してみます。

irb(main):001:0> a=Array.new(1,Array.new(2,Array.new(3,Array.new(4))))
=> [[[[nil, nil, nil, nil], [nil, nil, nil, nil], [nil, nil, nil, nil]], [[nil, nil, nil, nil], [nil, nil, nil, nil], [nil, nil, nil, nil]]]]
irb(main):002:0> a.transpose()
=> [[[[nil, nil, nil, nil], [nil, nil, nil, nil], [nil, nil, nil, nil]]], [[[nil, nil, nil, nil], [nil, nil, nil, nil], [nil, nil, nil, nil]]]]
irb(main):003:0>

転換されるのは一次元二次元だけで、三次元以降は変化ないようです。

コメント

タイトルとURLをコピーしました