UNPACK
copyright

green dotUNPACK

書式 UNPACK(VECTOR,MASK,FIELD)
機能 1次元配列VECTORの要素をMASKに従って配列の指定した位置に配布する。
配列VECTORの要素順序に従って、MASKの真である要素のi番目(i=1,2,…,t)に 対応する要素の値を、VECTOR(i)とする。
ここでtは、MASK中の真である要素の個数とする。
他の要素は、FIELDがスカラであるとき、それぞれFIELDに等しい値とし、 FIELDが配列であるとき、FIELDの対応する要素と等しい値とする。
引数
VECTOR:任意の型。形状は1次元配列で大きさ はMASKの真である要素の個数以上である必要がある。
MASK :論理型配列
FIELD :VECTORと同じ型、種別型パラメタでMASKと同じ形状
戻り値 型、種別型パラメタは引数VECTORと同じで、形状は引数MASKと同じである。

green dotサンプルプログラム

vect,mask,fが次の値であるとき、UNPACK関数でaを作成する。
     ┌───┬───┬───┐
 vect│ 7 │ 8 │ 9 │
     └───┴───┴───┘
     ┌─────┬─────┬─────┐
 mask│FALSE│TRUE │FALSE│
     │TRUE │FALSE│FALSE│
     │FALSE│FALSE│TRUE │
     └─────┴─────┴─────┘
     ┌───┬───┬───┐   ┌───┬───┬───┐
    f│ 1 │ 1 │ 1 │  a│ 1 │ 8 │ 1 │
     │ 2 │ 2 │ 2 │   │ 7 │ 2 │ 2 │
     │ 3 │ 3 │ 3 │   │ 3 │ 3 │ 9 │
     └───┴───┴───┘   └───┴───┴───┘

    INTEGER :: i
    INTEGER,DIMENSION(3)   :: vect
    INTEGER,DIMENSION(3,3) :: f,a
    LOGICAL,DIMENSION(3,3) :: mask
    vect=(/7, 8, 9/)
    mask(1,:)=(/.FALSE., .TRUE. , .FALSE./)
    mask(2,:)=(/.TRUE. , .FALSE., .FALSE./)
    mask(3,:)=(/.FALSE., .FALSE., .TRUE. /)
    f(1,:)=1; f(2,:)=2; f(3,:)=3
    a=UNPACK(vect,mask,f)
    WRITE(*,'(3I2)') (a(i,:),i=1,3)

実行例
1 8 1 7 2 2 3 3 9
line-end