2017-02-14 60 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