CSHIFT
copyright

green dotCSHIFT

書式 CSHIFT(ARRAY,SHIFT[,DIM])
機能 次元数が1である配列上で要素の循環移動(Circular Shift)を行うか、 または次元数が2以上である配列式の指定された次元に沿った1次元の 部分配列のすべてにおいて要素の循環移動を行う。
部分配列の端から外にはみ出した要素は、反対側の端に送られる。
それぞれの部分配列は、異なる方向に異なる量だけ移動してもよい。
(1)ARRAYが1次元配列であるとき、結果のi番目の要素は、 ARRAY(1+MODULO(i+SHIFT-1,SIZE(ARRAY)))とする。
(2)ARRAYが2次元以上の配列であるとき、結果の部分配列 (s1,s2,…,sDIM-1,:,sDIM+1, …,sn)の値は、CSHIFT(ARRAY(s1,s2, …,sDIM-1,:,sDIM+1,…,sn),sh,1)とする。
ここでshは、SHIFTまたはSHIFT(s1,s2, …,sDIM-1,sDIM+1,…,sn) とする。
nはARRAYの次元数とする。
引数
ARRAY任意の型の配列
SHIFT整数型でARRAYの次元数が1である場合、 スカラでなければならない。
ARRAYの次元数が2以上である場合、スカラまたはn-1次元の配列で、 形状は(d1,d2,…,dDIM-1, dDIM+1,…,dn)である。
ここで、(d1,d2,…,dn)は、 ARRAYの形状とする。
DIM
(省略可能)
整数型(1≦DIM≦n)DIMを 省略したときは、1になる。
戻り値 型、種別型パラメタおよび形状は引数ARRAYと同じである。

green dotサンプルプログラム

CSHIFT関数を用いて、2行3列のvの列を1列ずつ右へ移動してv1を作成する。
また、vの1行目を右へ1列、2行目を左へ1列移動してv2を作成する。
  ┌─┬─┬─┐      ┌─┬─┬─┐
v │1│2│3│    v │1│2│3├──┐
  ├─┼─┼─┤      ├─┼─┼─┤  │
  │4│5│6│ ┌────┤4│5│6│  │
  └┬┴┬┴┬┘ │左へ1 └─┴─┴─┘  │
   └┐│ │  ↓          右へ1↓
   ┌┼┼─┘ ┌─┬─┬─┐    ┌─┬─┬─┐
   ││└─┐ │5│6│4│    │3│1│2│
   │└┐ │ └─┴┬┴─┘    └─┴┬┴─┘
   ↓ ↓ ↓    │          │
  ┌─┬─┬─┐   │  ┌─┬─┬─┐ │
v1│3│1│2│   │v2│3│1│2│ │
  ├─┼─┼─┤   │  ├─┼─┼─┤ │
  │6│4│5│   └─→│5│6│4│←┘
  └─┴─┴─┘      └─┴─┴─┘

    INTEGER :: i
    INTEGER,DIMENSION(2,3) :: v,v1,v2
    v(1,:)=(/1, 2, 3/)
    v(2,:)=(/4, 5, 6/)
    v1=CSHIFT(v,-1,2)         !SHIFT=-1は右へ1
    v2=CSHIFT(v,(/-1,1/),2)   !-1は右へ1,1は左へ1
    WRITE(*,'(3I2)') (v1(i,:),i=1,2)
    WRITE(*,'(3I2)') (v2(i,:),i=1,2)

実行例
3 1 2 6 4 5 3 1 2 5 6 4
line-end