2017-02-14 7 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 возвращает массив (вид вектора индексов), и вы не можете использовать его для индексирования многомерных массивов. Векторное индексирование делает что-то еще и в основном используется для 1-D массивов.

Вы можете использовать maxval(), чтобы получить максимальное значение массива напрямую, но это может быть не то, что вам нужно во всех случаях.

Вы также можете использовать ассоциировать и избежать объявления новой переменной в области видимости:

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

но это будет более полезным, если ваше использование является более сложным и не может быть просто сделано maxval().

+0

Разве ваш метод не назывался 'maxloc' дважды? – chw21

+0

Какой метод? Ассоциированный? Нет, это не так. –

+0

Хорошо, я не знаю достаточно о том, как работает 'associate', и в любом случае, вероятно, он будет оптимизирован, но если нет, не будет ли он называть' maxloc' для каждого из индексов самостоятельно? – chw21