FORTRAN - MAXLOC返回数组中所有最大值的位置?

时间:2014-02-24 10:39:30

标签: arrays fortran

我正在寻找一种方法来获得具有数组最大值的所有位置,而不仅仅是第一个。据我所知,MAXLOC只返回它找到的第一个。有办法搞定所有人吗?

谢谢!

2 个答案:

答案 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))