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