声明:本文翻译自: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])
当只写lower和upper时,数组默认由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
Fortran:数组
最新推荐文章于 2023-03-19 17:11:03 发布