2017-02-14 62 views
0

我的问题更多的是要确认我所得出的结论是否正确,并确定是否有人有任何聪明的“解决方法”。通过列表访问数组

我的问题始于想要使用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 

它的工作原理,大家都高兴。那么,除了我。我想知道是否有更好的方法来做到这一点。有什么我失踪?解决问题的简单方法。

回答

4

是的,这是正确的,maxloc返回一个数组(索引向量的排序),并且不能将其用于多维数组索引。矢量索引做其他事情,主要用于一维数组。

您可以使用maxval()直接获取数组的最大值,但这可能不是您在所有情况下都需要的。

您还可以使用关联,避免范围宣告一个新的变量:

associate(id => maxloc(a)) 
    write(*,*) a(id(1),id(2)) 
end associate 

但如果你使用的是更复杂的,不能由maxval()只是做到这一点会更加有用。

+0

你的方法不会调用'maxloc'两次吗? – chw21

+0

哪种方法?关联?不,它不会。 –

+0

好的,我不太了解'associate'是如何工作的,它可能会被优化掉,但如果不是,它会不会为每个索引单独调用'maxloc'? – chw21