目录
Fortran中的高级数组及应用
(1) 二维数组
1) 声明
与一维数组声明接近,二维数组声明如:
REAL , DIMENSION(3,6)::array ! 3行6列实数数组,有效下标分别为1~3和1~6
INTEGER , DIMENSION(0:100,0:20) ! 101行21列整数数组,有效下标分别为0~100和0~20
CHARACTER(len=6) , DIMENSION(-2:2,10) ! 5行10列字符数组,有效下标分别为-2~2和0~10
2) 存储及初始化
数组是以列为主顺序进行存储的。
对于M
行N
列的二维数组,共M×N
个数据,存储的顺序是N1
列、N2
列…,按照列来进行内存分配。数据初始化和I/O语句的使用都是基于该存储特性。
二维数据的初始化原理主要有两种:DO
循环存储和列顺序内存存储,前者包含后者,相应的具体方法有以下三种:
-
赋值语句初始化
-
嵌套
DO
循环
对于M×N
二维数组,如果数据有规律,示意如下:INTEGER,DIMENSION(M , N) :: array DO i = 1,M ! 这是以行为主顺序存储 DO j = 1,N array(i,j) = j END DO END DO
INTEGER,DIMENSION(M , N) :: array DO i = 1,N ! 这是以列为主顺序存储 DO j = 1,M array(j,i) = j END DO ENDDO
-
RESHAPE
函数
可将一维数组old_array
转化成M
行N
列的二维数组,使用方式为:RESHAPE(old_array , [M,N])
,如:new_array = RESHAPE([ 1 ,1 ,1 ,1 ,2 ,2 ,2 ,2 ,3 ,3 ,3 ,3],[4,3])
需注意的是,按照列顺序进行存储,因此
new_array
中第一列元素均为1,第二列均为2。
-
-
类型声明初始化
使用方式与上述相同,不同的是在声明部分初始化,如:
INTEGER , DIMENSION(4,3)::new_array(4,3) = RESHAPE([ 1 ,1 ,1 ,1 ,2 ,2 ,2 ,2 ,3 ,3 ,3 ,3],[4,3])
-
READ
语句初始化- 通过隐式
DO
循环来按照行顺序存储(参考data1.txt
数据排序):
INTEGER::i,j INTEGER,DIMENSION(4,3)::array OPEN(10,FILE='data1.txt',STATUS='OLD',ACTION='READ') READ(10,*) ((array(i,j),j=1,3),i=1,4)
!data1.txt中的数据 1 2 3 1 2 3 1 2 3 1 2 3
- 通过程序的内存存储方式来读取(列存储):
INTEGER,DIMENSION(4,3)::array OPEN(10,FILE='data2.txt',STATUS='OLD',ACTION='READ') READ(10,*) array
!data2.txt中的数据 1 1 1 1 2 2 2 2 3 3 3 3
- 通过隐式
综上所述,在初始化或操作二维数组时,尽量使用(显/隐式)DO
循环,有助于提高程序的可读性,而不使用内存存储的初始化方法,该方法仅用于理解数组存储