Fortran 90/95: Как преобразовать трехмерный массив в одномерный массив
У меня есть 3D-массив NUM(0:9,0:9,0:9), который используется в качестве счетчика, чтобы отслеживать, сколько молекул лежит между определенными координатами. В любом случае, массив оказывается списком чисел, из которых я хочу сделать гистограмму. Если я записываю NUM в файл, а затем открываю его с помощью моей программы гистограмм и считываю его как одномерный массив, все в порядке, но я хотел бы сделать все это в одной программе, и мне было интересно, есть ли способ взять все числа, хранящиеся в NUM и превратить его в одномерный массив?
Мои извинения, если я не очень ясен, я новичок в программировании, и я все еще учусь по пути!
2 ответа
Поскольку это небольшой массив, вы можете попробовать
INTEGER :: i, j, k, n
n=0 ! or 1?
DO k=0,9
DO j=0,9
DO i=0,9
num1d(n) = num(i,j,k)
n = n+1
ENDDO
ENDDO
ENDDO
Распаковка потребует использования num(i,j,k) = num1d(n)
,
РЕДАКТИРОВАТЬ: Я неправильно понял, что вы хотите. Чтобы сделать то, что вы хотите, вам нужно иметь положение молекулы и ее расстояние r от начала координат. Предполагая, что это известно (или определимо), вам необходимо сделать следующее:
INTEGER :: i, j, k, n
num1d=0
DO k=0,9
DO j=0,9
DO i=0,9
r = ....
n = int(r)
num1d(n) = num1d(n) + num(i,j,k)
ENDDO
ENDDO
ENDDO
Где ....
это означает, что вы должны получить расстояние от источника. Выше также предполагает, что у вас есть ширина корзины 1, если вы хотите другие ширины, то вам нужно настроить n=int(r)
соответственно.
Заявление
new_array = pack(old_array,.true.)
опустит ранг 3 old_array
в ранг 1 new_array
, Вы можете объявить это как
real(kind=...), dimension(:), allocatable :: new_array
заменяя ...
по выбранному вами методу для указания вида реалов для использования.