Fortran90(cshift,eoshift)

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

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA