Fortran(spread)

旧2-5. Fortran毎日学習

spread関数を使います。
spreadは、配列の次元を増やす関数です。増えた配列の値は、元の配列からコピーされます。

spread(配列, 次元,コピー数)
takk@deb9:~$ cat func-spread-1.f90
      program main
        integer a(3)
        data a /1,2,3/

        write(*,*) a
        write(*,*) spread(a,dim=2,ncopies=5)

        stop
      end
takk@deb9:~$ gfortran func-spread-1.f90
takk@deb9:~$ ./a.out
           1           2           3
           1           2           3           1           2           3           1           2           3           1           2           3           1           2           3
takk@deb9:~$

結果がよくわからないので、shape関数を使ってspreadした後の配列の形状を確認します。

takk@deb9:~$ cat func-spread-2.f90
      program main
        integer a(3)
        data a /1,2,3/

        write(*,*) shape(spread(a,dim=2,ncopies=5))

        stop
      end
takk@deb9:~$ gfortran func-spread-2.f90
takk@deb9:~$ ./a.out
           3           5
takk@deb9:~$

3行5列の配列となりました。このようにコピーされた値が格納された配列となりました。

+-+-+-+-+-+
|1|1|1|1|1|
+-+-+-+-+-+
|2|2|2|2|2|
+-+-+-+-+-+
|3|3|3|3|3|
+-+-+-+-+-+

dim=を1に変えると、配列を拡張する方向(次元)が1に変わります。

takk@deb9:~$ cat func-spread-3.f90
      program main
        integer a(3)
        data a /1,2,3/

        write(*,*) shape(spread(a,dim=1,ncopies=5))

        stop
      end
takk@deb9:~$ gfortran func-spread-3.f90
takk@deb9:~$ ./a.out
           5           3
takk@deb9:~$

配列のイメージです。

+-+-+-+
|1|2|3|
+-+-+-+
|1|2|3|
+-+-+-+
|1|2|3|
+-+-+-+
|1|2|3|
+-+-+-+
|1|2|3|
+-+-+-+

do文を使って、イメージ通り格納されているか確認しみましょう。

takk@deb9:~$ cat func-spread-4.f90
      program main
        integer a(3),b(3,5),c(5,3)
        data a /1,2,3/

        b = spread(a,dim=2,ncopies=5)
        c = spread(a,dim=1,ncopies=5)

        write(*,*) 'b(3,5)'
        do i=1,3
            write(*,*) (b(i,j),j=1,5)
        end do

        write(*,*) 'c(5,3)'
        do i=1,5
            write(*,*) (c(i,j),j=1,3)
        end do

        stop
      end
takk@deb9:~$ gfortran func-spread-4.f90
takk@deb9:~$ ./a.out
 b(3,5)
           1           1           1           1           1
           2           2           2           2           2
           3           3           3           3           3
 c(5,3)
           1           2           3
           1           2           3
           1           2           3
           1           2           3
           1           2           3
takk@deb9:~$

コメント

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