Fortran:数组

声明:本文翻译自:https://www.tutorialspoint.com/fortran/fortran_arrays.htm

数组是可以存储相同类型的固定大小的连续元素集合。
数组用于存储数据集合,但将数组看作相同类型的变量集合通常更有用。
所有数组都由连续的内存位置组成。最低的地址对应于第一个元素,最高的地址对应于最后一个元素。
a(1),a(2),...,a(last)
数组可以是一维的(类似于向量),也可以是二维的(类似于矩阵)。最多可以声明只7个维度。

1. 声明数组
real :: a(5) !.. 声明大小为5的一维数组。默认下标从1开始,即a(1),...,a(5)
real :: a(-2:2)  !.. 也可以自己指定下标范围
二维与一维类似。
real :: a(5,5)
或者real :: a(-2:2,-2:2)

2. 赋值
(1) 对一个单一元素赋值
a(i) = some_number
(2) 用循环对数组片段或是整体赋值
do i = 1, 5
  a(i) = i * 1.0
end do
(3) 一维数组也可以用数组构造器"[]"直接赋值
a = [1., 2., 3., 4., 5.]
这里值得注意的是,这样声明并赋值的时候,里面的数据类型必须一致。
下面给出一个示例代码:
Program arrayProg
  real :: numbers(5) !one dimensional integer array
  integer :: matrix(3,3), i , j !two dimensional real array

  !assigning some values to the array numbers
  do i=1,5
     numbers(i) = i * 2.0
  end do

  !display the values
  do i = 1, 5
     Print *, numbers(i)
  end do

  !assigning some values to the array matrix
  do i=1,3
     do j = 1, 3
        matrix(i, j) = i+j
     end do
  end do

  !display the values
  do i=1,3
     do j = 1, 3
        Print *, matrix(i,j)
     end do
  end do

  !short hand assignment
  numbers = [1.5, 3.2,4.5,0.9,7.2]

  !display the values
  do i = 1, 5
     Print *, numbers(i)
  end do

End program arrayProg
用ivf,执行结果如下:
   2.000000
   4.000000
   6.000000
   8.000000
   10.00000
           2
           3
           4
           3
           4
           5
           4
           5
           6
   1.500000
   3.200000
   4.500000
  0.9000000
   7.200000

3. 将数组传递给子程序
将数组传递给子程序与函数的方法类似,再次就只介绍传给子程序的情况。
fortran语言允许我们将这个数组或是数组片段传递给子程序。代码如下:
Program arrayToProcedure      
  implicit none      
  integer, dimension (5) :: myArray  
  integer :: i

  call fillArray (myArray)      
  call printArray(myArray(2:))

End program arrayToProcedure


Subroutine fillArray (a)      
    implicit none      

    integer, dimension (5), intent (out) :: a

    ! local variables     
    integer :: i     
    do i = 1, 5         
      a(i) = i      
    end do  

End subroutine fillArray 


Subroutine printArray(a)

    integer, dimension (4) :: a  
    integer::i

    do i = 1, 4
      Print *, a(i)
    end do

End subroutine printArray
用ivf执行后的结果如下:
2
3
4
5

下面给出一个使用size的示例代码:
module test 
  implicit none
contains 
  subroutine fillArray (a)      
    implicit none      
     integer, intent (out) :: a(:)      

     ! local variables     
     integer :: i, arraySize  
     arraySize = size(a)

     do i = 1, arraySize         
        a(i) = i      
     end do  

  end subroutine fillArray 


  subroutine printArray(a)
    implicit none
    integer :: a(:)  
    integer :: i, arraySize

    arraySize = size(a)

    do i = 1, arraySize
      Print *, a(i)
    end do

  end subroutine printArray
End module test

Program arrayToProcedure
  use test       
  implicit  none    
  integer :: myArray(5) 

  call fillArray (myArray)      
  call printArray(myArray)

End program arrayToProcedure
这里比较超前,使用了module。因为这个示例中使用的不定结构数组(此处详解看书),所以需要写interdace或是module。关于interface的代码如下:
Program arrayToProcedure      
    implicit  none    
    integer, dimension (5) :: myArray  
    integer :: i

    interface 
      subroutine fillArray (a)
        integer, dimension(:), intent (out) :: a 
        integer :: i         
      end subroutine fillArray      

      subroutine printArray (a)
        integer, dimension(:) :: a 
        integer :: i         
      end subroutine printArray   
    end interface 

    call fillArray (myArray)      
    call printArray(myArray)

End program arrayToProcedure


  subroutine fillArray (a)      
    implicit none      
    integer,dimension (:), intent (out) :: a      

    ! local variables     
    integer :: i, arraySize  
    arraySize = size(a)

    do i = 1, arraySize         
      a(i) = i      
    end do  

  end subroutine fillArray 


  subroutine printArray(a)
    implicit none

    integer,dimension (:) :: a  
    integer::i, arraySize
    arraySize = size(a)

    do i = 1, arraySize
      Print *, a(i)
    end do

  end subroutine printArray
用ivf执行后的结果如下:
1
2
3
4
5

4. 数组片段
Fortran语言允许对数组片段进行操作。提取数组片段的语法如下:
array([lower]:[upper][:stride])
当只写lowerupper时,数组默认由1开始。
示例代码如下:
Program arraySubsection
  implicit none 
  real :: a(10), b(10)
  integer:: i, asize, bsize

  a(1:7) = 5.0 ! a(1) to a(7) assigned 5.0
  a(8:) = 0.0  ! rest are 0.0 
  b(2:10:2) = 3.9  !.. b(2),b(4),b(6),b(8),b(9)
  b(1:9:2) = 2.5   !.. b(1),b(3),b(5),b(7),b(9)

  !display
  asize = size(a)
  bsize = size(b)

  do i = 1, asize
     Print *, a(i)
  end do

  do i = 1, bsize
     Print *, b(i)
  end do

End program arraySubsection
执行后结果为:
   5.000000
   5.000000
   5.000000
   5.000000
   5.000000
   5.000000
   5.000000
  0.0000000E+00
  0.0000000E+00
  0.0000000E+00
   2.500000
   3.900000
   2.500000
   3.900000
   2.500000
   3.900000
   2.500000
   3.900000
   2.500000
   3.900000

5. 数组内置函数
数组内置函数比较多,打算后面分开来写。具体有以下几项:
(1) 向量与矩阵乘法
(2) reduction
(3) 查询
(4) reshape
(5) Manipulation:主要有cshift,eoshift,transpose
(6) 定位Location
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值