2017-02-14 4 views
0

私の質問は、私が描いた結論が正しいことを確認し、誰もスマートな "回避策"を持っているかどうかを確認するための探求です。リストを介した配列アクセス

私の問題は、maxlocを使用して配列の最大値の位置を抽出し、この結果を使用して他の配列の対応する要素を読み取ろうとすることから始まります。擬似コード、すなわち:これは、しかし(彼は(N、N)配列で使用された)エラー

Error: Rank mismatch in array reference at (1) (1/2) 

を返し

c = b(maxloc(a)) 

を私はいくつかのテストを行なったし、私はこのことを発見確かに動作しません。

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は配列(インデックスのベクトルのソート)を返し、多次元配列のインデックス付けには使用できません。ベクトル索引付けは何かを行い、主に1次元配列に使用されます。

maxval()を使用すると、配列の最大値を直接得ることができますが、それはすべての場合に必要なものではないかもしれません。

また仲間を使用して、スコープの新しい変数の宣言を避けることができます。

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

をが、あなたの使用は、より複雑であり、ちょうどmaxval()によって行うことができない場合には、より有用であろう。

+0

'maxloc'を2回呼び出す方法はありませんか? – chw21

+0

どちらの方法?仲間?いいえ、そうではありません。 –

+0

さて、 'associate'の仕組みが分かりませんし、とにかく最適化されているかもしれませんが、もしそうでなければ、それぞれのインデックスに対して' maxloc'を個別に呼び出さないのでしょうか? – chw21

関連する問題