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:~$
コメント