Fortran 90/95:如何将3D阵列转换为1D阵列

时间:2013-06-12 14:16:32

标签: fortran90 multidimensional-array

我有一个3D数组NUM(0:9,0:9,0:9),用作各种计数器,以跟踪某些坐标之间有多少分子。无论如何,数组最终是一个数字列表,我想用它来制作直方图。如果我将NUM写入一个文件,然后用我的直方图程序打开它并将其作为一维数组读取,一切都很好,但我想在一个程序中完成所有这一切我想知道是否有一个获取存储在NUM中的所有数字并将其转换为1维数组的方法?

我很抱歉,如果我不是很清楚,我是编程的新手,我还在学习!

2 个答案:

答案 0 :(得分:4)

声明

new_array = pack(old_array,.true.)

将等级3 old_array压缩为等级1 new_array。您可以将其声明为

real(kind=...), dimension(:), allocatable :: new_array

用您选择的方法替换...以指定要使用的实体种类。

答案 1 :(得分:0)

由于它是一个小数组,您可能想尝试

    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

....无论何种意味着您必须与原点保持距离。上面还假设您的bin宽度为1,如果您想要其他宽度,则需要适当调整n=int(r)