Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays FORTRAN-MAXLOC返回数组中最大值的所有位置?_Arrays_Fortran - Fatal编程技术网

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

Arrays FORTRAN-MAXLOC返回数组中最大值的所有位置?,arrays,fortran,Arrays,Fortran,我正在寻找一种方法来获取数组中所有具有最大值的位置,而不仅仅是第一个位置。据我所知,MAXLOC只会返回它找到的第一个。有没有办法得到所有的钱 谢谢大家! 试试类似的方法 pack([(ix,ix=1,size(array))],array==maxval(array)) 试试像这样的东西 pack([(ix,ix=1,size(array))],array==maxval(array)) [通过@HighPerformanceMark将答案扩展到排名2的数组。] PACK中两个数组的形状(

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

谢谢大家!

试试类似的方法

pack([(ix,ix=1,size(array))],array==maxval(array))
试试像这样的东西

pack([(ix,ix=1,size(array))],array==maxval(array))

[通过@HighPerformanceMark将答案扩展到排名2的数组。]

PACK
中两个数组的形状(索引和掩码)必须匹配(掩码为标量时除外-术语是一致的)。由于遮罩
matrix==MAXVAL(matrix)
不是标量,您可以将元素选择数组重塑为一致的:

PACK(RESHAPE([(ix, ix=1, SIZE(matrix))], SHAPE(matrix)), matrix==MAXVAL(matrix))
以数组元素顺序为您提供元素(即,表示它的单个整数,如同存在秩1数组)。这基本上与前面的答案相同,但随后需要将数组元素顺序映射到各个维度。在秩1的情况下,这种映射很简单。[一般来说,如果某些级别的下限不是1,则您也需要考虑到这一点。]

或者,您可以在矩阵的各个行/列上循环,并单独使用秩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

[通过@HighPerformanceMark将答案扩展到排名2的数组。]

PACK
中两个数组的形状(索引和掩码)必须匹配(掩码为标量时除外-术语是一致的)。由于遮罩
matrix==MAXVAL(matrix)
不是标量,您可以将元素选择数组重塑为一致的:

PACK(RESHAPE([(ix, ix=1, SIZE(matrix))], SHAPE(matrix)), matrix==MAXVAL(matrix))
以数组元素顺序为您提供元素(即,表示它的单个整数,如同存在秩1数组)。这基本上与前面的答案相同,但随后需要将数组元素顺序映射到各个维度。在秩1的情况下,这种映射很简单。[一般来说,如果某些级别的下限不是1,则您也需要考虑到这一点。]

或者,您可以在矩阵的各个行/列上循环,并单独使用秩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)处抱怨“内在“pack”(1和2)的参数“array”和“mask”中的列组不兼容”。好吧,如果看不到您的代码,我只会在黑暗中摸索。我可能会刺伤自己的脚。整数,维度(233233)::矩阵整数::我打开(UNIT=4,file='test.txt',STATUS='unknown')!矩阵是一个数组,包含-20到+7之间的评分值,太复杂,与在此处发布WRITE(4,*)pack([(i,i=1,size(matrix))],matrix==maxval(matrix))无关。啊,您有一个秩2数组。我的解决方案基于一个错误的假设,可能对您没有多大帮助。在某些情况下,聪明的技巧,例如使用
pack
重塑
,变得更难编码和理解,您最好只编写一两个循环。不幸的是,编译器正在抱怨“在(1)处内在“pack”(1和2)的参数“array”和“mask”中存在不兼容的列组”好吧,如果看不到您的代码,我只会在黑暗中冒险。我可能会在foot.INTEGER,DIMENSION(233233233,233):矩阵整数::我打开(UNIT=4,file='test.txt',STATUS='unknown')!matrix是一个数组,包含介于-20和+7之间的评分值,太复杂,与post here WRITE(4,*)pack([(i,i=1,size(matrix))]无关,matrix==maxval(matrix))啊,您有一个秩2数组。我的解决方案基于一个错误的假设,可能对您没有多大帮助。在某些情况下,聪明的技巧,例如使用
pack
重塑
,变得更难编码和理解,您最好只编写一两个循环。这种方法的问题是它将索引或者x和y变成一个整数。比如:3753 3809 3921 31713 31769 31881 44761 44817 44929,其中第一个是37,53。这对前几个来说很容易,但一旦索引数变高,我不知道它是31,881还是318,81。也许这与我的pri方式有关计算值?我只使用了“WRITE(,)”,我可能会更清楚地看到您得到的结果。例如,您没有看到(37,53),但它是按内存存储顺序排列的元素3753。如果矩阵是75x75,那么您的索引将是(3,51)。这种方法的问题是,它将x和y的索引放入一个整数中。例如:3753 3809 3921 31713 31769 31881 44761 44817 44929,其中第一个是37,53。这对前几个很容易,但一旦索引数增加,我就不知道它是31,881还是318,81。也许这与我打印值的方式有关?我只是使用“WRITE(,)”,我可能会更清楚地看到你得到的结果。例如,你看不到(37,53),但它是按内存存储顺序排列的元素3753。如果
matrix
是75x75,那么你的索引将是(3,51)。