配列の要素のシフトをしてくれる関数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:~$
コメント