Это немного сложно; Я бы приветствовал любые замечания о том, как улучшить ясность вопроса.Выделить динамический массив с взаимозависимыми размерами
Хорошо, что у меня есть массив:
real, allocatable :: A(:,:,:)
, и я хочу, чтобы выделить его, прежде чем использовать его. Возможно ли, чтобы размер третьего измерения зависел от размера второго измерения?
E.g.
do i=1,n
allocate(A(3,i,i**2))
end do
Очевидно, что вышеуказанное не работает. Я хотел бы в конечном итоге с массивом (или набор массивов) с формой (ами)
(3,1,1), (3,2,4), (3,3,9), ... (3, n, n^2)
где размер третьего измерения является квадрат размера второго измерения.
Мое правило для размера зависимого измерения немного сложнее, но если возведение в квадрат возможно, я могу сделать все остальное.
Возможно ли это? Если да, то как я могу реализовать его в Фортране?
Что будет shape(A)
возвращение? Это было бы интересно.
Моя другая альтернатива выделить максимальный размер требуемого, и быть осторожными, чтобы использовать только определенные элементы в расчетах, т.е.
allocate(A(3,n,n**2))
Даже если я не трудно на память в данный момент, я «Мне нравится иметь хорошие методы программирования. В любом случае, это интересная проблема.
спасибо.
РЕДАКТИРОВАТЬ:
Что о том, размер измерения зависит от величины элемента в другом измерении?
В ответ ниже размера массива в обоих измерениях зависит от индекса B. Я хотел бы что-то вдоль линий
type myarray
real :: coord(3)
integer,allocatable :: lev(:)
integer, allocatable :: cell(:)
endtype myarray
type(myarray), allocatable :: data
allocate(data(m))
allocate(data%lev(n))
forall (j=1:n) !simple now, for argument's sake
lev(j)=j
endforall
! I was thinking of using a FORALL loop here, but the errors returned
! suggested that the compiler (gfortran) didn't expect IF blocks and ALLOCATE
! statements in a FORALL block
do i=1,m
do j=1,n
allocate(data(i)%cell(lev(j)**2))
enddo
enddo
Вы получаете то, что я имею в виду? Но программа падает, поскольку она пытается выделить уже выделенные переменные, например. когда i=1
выделяет data(1)%cell(1)
, а затем пытается выделить data(1)%cell(2)
... о, о. То, что я хочу что-то вроде:
Каждого data(i)
имеет массив lev(j)
значений, с j
работает от 1 до п, и для каждого lev(j)
значения мы имеем cell
размера lev
^2. Обратите внимание, что эти cell
уникальны для каждого data(i)
и каждого lev
, а размер этого конкретного cell
зависит от соответствующего значения lev
и, возможно, соответствующего data(i)
.
Должен ли я использовать производный тип в производном типе?
Точно так же вы знаете, тип массива, который вы ищете, называется «зубчатым» массивом, как и «прямоугольный» массив. Ниже приведен правильный ответ IRO-bot; в массивах Fortran сами по себе всегда прямоугольны, но вы можете использовать определенные типы, чтобы создать свою собственную структуру. –
«Jagged» ... эй, это имеет смысл, наглядно. «... вы можете использовать определенные типы, чтобы создать свою собственную структуру». В самом деле? Поэтому, если мне нужен массив, чья форма увеличивается до половины, то уменьшается или следует за последовательностью Фибоначчи или полностью случайна - все это возможно для не слишком больших усилий ... круто! –
@SamuelTan Я отредактировал свой ответ с обновленным кодом, чтобы решить вашу новую проблему. Сравните два кода, чтобы узнать, что вы делаете неправильно. – milancurcic