Использование вектора для индексации многомерного массива Fortran

Возможно ли в современном Fortran использовать вектор для индексации многомерного массива? То есть, учитывая, скажем,

integer, dimension(3) :: index = [4,6,9]
double precision, dimension(10,10,10) :: data

есть ли лучший (более общий) способ доступа к data(4,6,9), чем писать data(index(1), index(2), index(3))? Было бы неплохо не жестко закодировать ранг массива data.

(Наивно я хотел бы написать data(index), но, конечно, это на самом деле означает что-то другое - подмножество "сбор" - требуя, чтобы data был массивом ранга один.)

Для чего это стоит, по сути, такой же вопрос, как многомерный индекс по массиву индексов в JavaScript, но вместо этого в Fortran. К сожалению, умные ответы там не будут работать с предопределенными рядами.

Ответ 1

Нет. И все обходные пути, которые я могу придумать, - ужасные хаки, вам лучше написать функцию, чтобы взять data и index в качестве аргументов и выплюнуть нужные элементы.

Однако вы могли бы использовать современные возможности Fortran для переназначения рангов массива, чтобы сделать точно противоположное, что может удовлетворить ваше желание играть быстро и свободно с рангом массива.

Учитывая объявление

double precision, dimension(1000), target :: data

вы можете определить указатель ранга-3

double precision, pointer :: index_3d(:,:,:)

а затем установите его следующим образом:

index_3d(1:10,1:10,1:10) => data

и hey presto, теперь вы можете использовать индексы ранга 3 и ранга 1 в data, что близко к тому, что вы хотите сделать. Я еще не использовал это в гневе, но несколько простых тестов не выявили серьезных проблем.