使用 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]