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

заменяя ... по выбранному вами методу для указания вида реалов для использования.

Другие вопросы по тегам