У меня есть N-мерный набор данных (например, реальные числа), который хранится в виде одномерного массива с дополнительным массивом измерений, который указывает исходные размеры.
Кроме того, даны функции для вывода одномерного индекса из N-D индекса и наоборот.
Я пытаюсь понять, как мне сделать цикл выполнения (или эквивалент) для общего N-мерного индекса (который, конечно, будет преобразован в 1D-индекс) из некоторого набора ограничивающих нижних индексов в набор верхних индексов . Поэтому мне нужен «N-мерный» цикл, который не проходит по всем значениям — только часть массива, поэтому выполнение линейного индекса эквивалентного одномерного массива не имеет значения (по крайней мере без модификаций).
Это схема моей проблемы:
subroutine Test(Array,Dims,MinIndex,MaxIndex)
implicit none
real , dimension(1:), intent(inout) :: Array
integer, dimension(1:), intent(in) :: Dims,MinIndex,MaxIndex
integer, dimension(size(Dims)) :: CurrInd
integer :: 1Dindex
! size(Dims) can be 1, 2, 3 ,..., N
! size(MinIndex)==size(MaxIndex)==size(Dims)
! size(Array)==Product(Dims)
! 1Dindex=Get1dInd(NDindex,Dims)
! NDindex=GetNdInd(1Dindex,Dims)
! How do I actually preform this?
do CurrInd=MinIndex,MaxIndex
1Dindex=Get1dInd(CurrInd,Dims)
<Some operation>
enddo
end subroutine
Я подумал, что можно зациклиться на массиве Dims
и использовать внутренний цикл, но мне не удается правильно записать процедуру.
Другой вариант, который у меня не сработал (может быть, потому, что я его неправильно использую?), — это FORALL
, так как он требует указания каждого индекса отдельно.