【Fortran】二维、多维数组及相应高级特性

本文详细介绍了Fortran中的二维和多维数组的声明、初始化、操作,以及高级特性如WHERE结构和FORALL结构的使用。重点讨论了数组的存储方式、内置函数应用,以及静态、动态数组和自动数组的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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) 存储及初始化

数组是以列为主顺序进行存储的。

对于MN列的二维数组,共M×N个数据,存储的顺序是N1列、N2列…,按照列来进行内存分配。数据初始化和I/O语句的使用都是基于该存储特性。

二维数据的初始化原理主要有两种:DO循环存储和列顺序内存存储,前者包含后者,相应的具体方法有以下三种:

  1. 赋值语句初始化

    1. 嵌套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
      
    2. RESHAPE函数
      可将一维数组old_array转化成MN列的二维数组,使用方式为: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。

  2. 类型声明初始化
    使用方式与上述相同,不同的是在声明部分初始化,如:
    INTEGER , DIMENSION(4,3)::new_array(4,3) = RESHAPE([ 1 ,1 ,1 ,1 ,2 ,2 ,2 ,2 ,3 ,3 ,3 ,3],[4,3])

  3. READ语句初始化

    1. 通过隐式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 
    
    1. 通过程序的内存存储方式来读取(列存储):
    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循环,有助于提高程序的可读性,而不使用内存存储的初始化方法,该方法仅用于理解数组存储

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值