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>
転換されるのは一次元二次元だけで、三次元以降は変化ないようです。


コメント