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