24小时热门版块排行榜    

CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2026级博士研究生招生报考通知(长期有效)
查看: 637  |  回复: 1

jerkwin

专家顾问 (正式写手)

[交流] Fortran90数组学习已有1人参与

最近学习了一下Fortran90的数组,主要是参考中科大的教程http://micro.ustc.edu.cn/Fortran/ZJDing/。下面是我的一点总结,希望对大家熟悉Fortran的数组有所帮助。
CODE:
[font=Courier New]
数组的定义与引用

两种变量:标量+数组。标量维数为0,数组维数>=1。

1.        数组的定义
类型相同的一组标量数据的有序集合
数组元素类型必须相同,这些元素按某种确定方式排列

与数学上的联系
一维数组:向量(列向量或行向量)
二维数组:矩阵

数组的参数
o        数组的维数(dimension):最小为1,最大为7
o        数组的维长(extent):某一维中元素的个数,可以为0
维长由 维下界:维上界 指定,等于维上界-维下界+1
维下界省略时为默认值1
维上界必须大于维下界的值
维界值可以是正、负、零或任何整型表达式
o        数组的大小(size):所有元素的个数,等于各维长的乘积,可以为0
o        数组的形状(shape):取决于维数与每一维的维长,可由函数shape得到

例:
数组A(10,3,2)的维数为3,维长分别为10、3、2,大小为10×3×2=60,形状为10乘3乘2,或表示成(10,3,2),shape(A)的结果是一维数组,其元素为10,3,2。
数组B(2,2,0)的第三维维长为0,因而大小为0,不能用于存储任何数据。
数组C(2, 0:9, -3:-1, int(-sqrt(45./3.)):int(5/2))为4维数组,大小为2×10×3×6。

数组声明:
o        real A(10,2,3) ! 类型说明
o        dimension A(10,2,3) ! dimension语句
o        allocatable B(:,:) ! allocatable语句
o        pointer C(:,:,:) ! pointer语句
o        real, dimension(2,5):: D ! 类型说明中的dimension属性
o        real, allocatable:: E(:,:,:) ! 类型说明中的allocatable属性
o        real, pointer:: F(:,:) ! 类型说明中的pointer属性
声明时数组的维数必须指定的,大小和形状是否需要指定视数组的形式而定

2.        数组的引用
o        数组名 :数组中所有元素,无下标
o        数组元素:数组中某个元素,指定所有下标
o        数组片段:数组中若干元素,不需连续或遵循某个规则,指定部分下标列表,本身也是数组

引用时数组的下标必须用逗号隔开
引用下标的个数要和声明的数组的维数一致
下标是整型表达式,可正、可负、也可为0,但必须在引用的数组的维界之内

例: real A(3,3),B(3,3),C(89),R
B(2,2)=4.5; R=7.O; C(int(R)*2+1)=2.O !给元素B(2,2)和C(15)赋值
A(1,2)=B(int(C(15)),int(sqrt(R))) !元素A(1,2)和元素B(2,2)的值相同
real A(2,3,4),则A(1,2,3)是数组元素,而A(1:2,2,2),A(1,1,4:2:-1),A(1,2:3,(/2,4/))都是数组片段

数组的下标列表有两种:三元下标和向量下标。
o        三元下标[下界]:[上界][:步长]:用三个值分别代表数组片段的下界,上界和步长,以上升或下降的顺序指定数组元素。
若省略下(上)界,缺省值为数组相应维的下(上)维界
若上下界全省略,缺省片段为这个维的全长
三元下标的值可以不在数组的边界以内
三元下标只能算一个下标
对多维数组的数组片段,每一维都可以用三元下标来声明
在语句或过程中引用数组片段时,引用下标的个数必须与声明时的相同
若省略步长,缺省值为1。
步长不能是0。当步长为负值时,数组子片段从上界开始递减至下界

例:real A(10)
A(1:5:2)=3.0 !把元素A(1),A(3),A(5)置为3.0
A(:5:2)=3.O !把元素A(1),A(3),A(5)置为3.0,因为缺省下界为1
A(2::3)=3.O !把元素A(2),A(5),A(8)置为3.0,因为上界缺省值为10
A(7:9)=3.0 !把元素A(7),A(8),A(9)置为3.0,因为缺省步长为1
A(:)=3.0 !和A=3.0相同,将A的所有元素置为3.0
real B(10)
数组片段B(9:2:-2)是由元素B(9),B(7),B(5)和B(3)组成的数组。
数组片段B(3:15:6)是由B(3)和B(9)组成的数组。 REAL A(5,9)则A(1:4:3,6:8:2)=3.0
等价于
A(1,6)        A(1,8)
A(4,6)        A(4,8)

o        向量下标:利用一个一维整数数组(即向量)来指定数组元素
向量下标的值应该在定义的边界之内
向量下标可以有多个重复的值,此时数组片段称为多对一数组片段

例: real A(10),B(5,5)
integer I(4),J(3)
I=(/5,3,8,2/) !定义向量I
J=(/3,1,5/) !定义向量J
A(I)=3.O !设置元素A(5),A(3),A(8),A(2)的值
B(2,J)=3.O !设置元素B(2,3),B(2,1)和B(2,5)的值

integer :: a(4)=(/0,1,2,3/),b(3)=(/1,4,3/),则a(b)与a同类型,与b同形状,取值为(/0,3,2/)
a(b)可以不是数组片段,而是更大的数组。如上面b为(/2,3,2,3,2,3/)时,a(b)为(/1,2,1,2,1,2/)

character(1) :: symbol(0:1)=(/'F','M'/)
integer :: bit(100)
若bit的元素列为0001101100111...,则symbol(bit)是用{F,M}字符构成的100字节的字符型数组FFFMMFMMFFMMM...。

real A(3,3),B(4)
integer K(4)
K=(/3,1,1,2/) !K矢量有重复值
A=5.0 !设置A的所有元素
B=A(3,K) !数组片段B由下列元素组成:A(3,3),A(3,1),A(3,1),A(3,2)
因为在B(4)或A(3,K)中有重复的元素A(3,1),所以它是多对一数组片段。一个多对一数组片段不能出现在赋值语句的左端[/font]

[ Last edited by jerkwin on 2012-7-27 at 08:39 ]
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
2楼2012-07-29 22:44:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 jerkwin 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见