我正在寻找一种方法来获得具有数组最大值的所有位置,而不仅仅是第一个。据我所知,MAXLOC只返回它找到的第一个。有办法搞定所有人吗?
谢谢!
答案 0 :(得分:3)
[将@HighPerformanceMark的答案扩展到你的排名2的数组。]
PACK
中的两个数组的形状(索引和掩码)必须匹配(除非掩码是标量 - 术语是 conformable )。由于你的掩码matrix==MAXVAL(matrix)
不是标量,你可以重新整形元素选择数组:
PACK(RESHAPE([(ix, ix=1, SIZE(matrix))], SHAPE(matrix)), matrix==MAXVAL(matrix))
以数组元素顺序给出元素(即,表示它的单个整数,就像有一个rank-1数组)。这与前一个答案基本相同,但您需要将数组元素顺序映射到各种维度。这种映射在rank-1情况下是微不足道的。 [一般来说,如果某个等级的下限不是1,那么你还需要考虑到这一点。]
或者,您可以循环遍历矩阵的各个行/列,并单独使用rank-1切片方法。
甚至,正如@HighPerformanceMark进一步评论的那样,当一个具有更高秩数组时,这个数组元素顺序结果不太直观,也许处理起来更棘手。除非多级索引持续有用,否则使用更清晰的循环方法可能会更好:
do i2=1, SIZE(matrix,2)
do i1=1, SIZE(matrix,1)
if (matrix(i1,i2).ne.MAXVAL(matrix)) cycle
...
end do
end do
答案 1 :(得分:2)
尝试类似
的内容pack([(ix,ix=1,size(array))],array==maxval(array))