配列の要素のシフトをしてくれる関数cshiftとeoshiftを使います。
cshiftはcircular shiftを意味しており、循環するシフトです。
takk@deb9:~$ cat func-cshift.f90
program main
integer a(5),b(5)
data a /1,2,3,4,5/
write(*,*) a
b = cshift(a,2)
write(*,*) b
stop
end
takk@deb9:~$ gfortran func-cshift.f90
takk@deb9:~$ ./a.out
1 2 3 4 5
3 4 5 1 2
takk@deb9:~$
上記ではshift値に2を指定したので要素が2つ左にずれて、飛び出した2個の要素は、右側に収まりました。
shift値をマイナスにすると逆方向にシフトします。
takk@deb9:~$ cat func-cshift2.f90
program main
integer a(5)
data a /1,2,3,4,5/
write(*,*) 'left'
write(*,*) cshift(a,1)
write(*,*) cshift(a,2)
write(*,*) cshift(a,3)
write(*,*) cshift(a,4)
write(*,*) 'right'
write(*,*) cshift(a,-1)
write(*,*) cshift(a,-2)
write(*,*) cshift(a,-3)
write(*,*) cshift(a,-4)
stop
end
takk@deb9:~$
takk@deb9:~$ gfortran func-cshift2.f90
takk@deb9:~$ ./a.out
left
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
right
5 1 2 3 4
4 5 1 2 3
3 4 5 1 2
2 3 4 5 1
takk@deb9:~$
eoshiftは、end-off shiftの略だそうです。こちらは循環しません。シフトで空になった場所には、値を指定しないと0が入ります。
takk@deb9:~$ cat func-eoshift.f90
program main
integer a(5),b(5)
data a /1,2,3,4,5/
write(*,*) a
b = eoshift(a,2)
write(*,*) b
stop
end
takk@deb9:~$ gfortran func-eoshift.f90
takk@deb9:~$ ./a.out
1 2 3 4 5
3 4 5 0 0
takk@deb9:~$
シフトで空になった要素に値を指定するには、boundary=を指定します。
takk@deb9:~$ cat func-eoshift2.f90
program main
integer a(5)
data a /1,2,3,4,5/
write(*,*) eoshift(a,1,boundary=999)
write(*,*) eoshift(a,2,boundary=999)
write(*,*) eoshift(a,3,boundary=999)
write(*,*) eoshift(a,4,boundary=999)
write(*,*) eoshift(a,-1,boundary=999)
write(*,*) eoshift(a,-2,boundary=999)
write(*,*) eoshift(a,-3,boundary=999)
write(*,*) eoshift(a,-4,boundary=999)
stop
end
takk@deb9:~$ gfortran func-eoshift2.f90
takk@deb9:~$ ./a.out
2 3 4 5 999
3 4 5 999 999
4 5 999 999 999
5 999 999 999 999
999 1 2 3 4
999 999 1 2 3
999 999 999 1 2
999 999 999 999 1
takk@deb9:~$


コメント