使用 PACK 選擇滿足條件的元素

內在的 pack 函式將陣列打包到一個向量中,根據給定的掩碼選擇元素。該功能有兩種形式

PACK(array, mask)
PACK(array, mask, vector)

(也就是說,vector 引數是可選的)。

在這兩種情況下,array 都是一個陣列,並且是邏輯型別的 mask,並且與 array(標量或相同形狀的陣列)一致。

在第一種情況下,結果是 array 的型別和型別引數的 rank-1 陣列,元素的數量是掩碼中真實元素的數量。

integer, allocatable::positive_values(:)
integer::values(5) = [2, -1, 3, -2, 5]
positive_values = PACK(values, values>0)

結果 positive_values 是陣列 [2, 3, 5]

vector rank-1 引數出現時,結果現在是 vector 的大小(whcih 必須至少具有與 mask 中的真值一樣多的元素。

vector 的效果是返回該陣列,該陣列的初始元素被 array 的掩碼元素覆蓋。例如

integer, allocatable::positive_values(:)
integer::values(5) = [2, -1, 3, -2, 5]
positive_values = PACK(values, values>0, [10,20,30,40,50])

導致 positive_values 成為陣列 [2,3,5,40,50]

應該注意的是,無論引數 array 的形狀如何,結果始終是秩 -1 陣列。

除了選擇滿足掩蔽條件的陣列的元素之外,確定滿足掩蔽條件的索引通常是有用的。這個常見的習語可以表達為

integer, allocatable::indices(:)
integer i
indices = PACK([(i, i=1,5)], [2, -1, 3, -2, 5]>0)

導致 indices 成為陣列 [1,3,5]