我的问题更多的是要求确认我所得出的结论是正确的,看看是否有人有任何聪明的“解决方法”。
我的问题始于一位想要使用maxloc
提取数组最大值位置的朋友,然后使用此结果读取另一个数组的相应元素。我在伪代码中:
c = b(maxloc(a))
然而,这会返回错误
Error: Rank mismatch in array reference at (1) (1/2)
(他正在使用(N,N)数组。)
我做了一些测试,但我发现这确实不起作用。 我的结论是你需要做这样的事情:
program h
integer :: a(2,2)
integer :: id(2),id2(2)
a(1,1) = 1; a(1,2) = 2; a(2,1) = 3; a(2,2) = 2
id = maxloc(a)
write(*,*) a(id(1),id(2))
end program h
它很有效,每个人都很开心。好吧,除了我。我想知道是否有更好的方法。有什么我想念的吗?解决问题的简单方法。
答案 0 :(得分:4)
是的,这是正确的,maxloc
返回一个数组(一种索引向量),你不能将它用于多维数组索引。向量索引做了其他事情,主要用于1-D数组。
您可以使用maxval()
直接获取数组的最大值,但这可能不是您在所有情况下都需要的。
您还可以使用关联并避免在范围中声明新变量:
associate(id => maxloc(a))
write(*,*) a(id(1),id(2))
end associate
但如果您的使用更复杂且无法由maxval()
完成,那将更有用。