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:~$


コメント