1、数值赋初值操作:
例子:
INTEGER A(5)
DATA A /1,2,3,4,5/ !fortran77 通常用法
或者
INTEGER A(5)
INTEGER I
DATA (A(I),I=2,4) /2,3,4/ !用隐含式的循环将 A(2)=2,A(3)=3,A(4)=4赋值。
下面用FORTRAN95的用法赋值,例子如下:
integer::a(5)=(/1,2,3,4,5/)
直接将数组A的5个元素赋值,注意:省略DATA直接把初始值写在声明语句后面时候,每个元素都必须赋值,因此简单的做法是用隐含式DO循环完成,另外就是干脆把数组的全部元素都用一个相同值来赋值。例如下面:
integer::a(5)=1 !a(1)=a(2)=a(3)=a(4)=(5)=5
或者
integer::I
integer::a(5)=(/(I,I=1,5)/) !a(1)=1,a(2)=2,a(3)=3,a(4)=4,a(5)=5
2、对部分数组的操作: FORTRAN90为我们提供了一次只挑出部分数组来操作的功能,这一功能的实现类似于隐含式的循环操作,下面用如下几个例子来说明:
a(3:5)=5 !a(3)=a(4)=a(5)=5,其他元素值不变
a(3:)=5 !把a(3)以后的元素的值都赋值成5,a(1)和a(2)不变,
a(1:3)=b(4:6) !a(1)=b(4),a(2)=b(5),a(3)=b(6)
a(1:10)=a(10:1:-1) !将a(1~10)的内容给翻转过来存储a中
a(:,:)=b(:,:,1) !要保证三维数组B中的二维数组全部元素对应的赋值给二维数组A中
要注意的是多个隐含式循环,较低维的循环对应是内层循环,而且必须保证赋值符号两侧的数组元素是同样数目,如下面的例子:
integer::a(2,2),b(2,2)
b=a(2:1:-1,2:1,:-1) !相当于 b(1,1)=a(2,2);b(2,1)=a(1,2);b(1,2)=a(2,1);
!b(2,2)=a(1,1)
3、应用where对部分数组操作
where是FORTRAN95新加入的功能,类似于IF的功能,使用它可以使得程序精简化,但是他的使用同样要保证两个数组质检的维数和大小是相同的。例如a和b都是一维数组而且都是含有5个元素的,那么下面:
where(a<3)
b=1
elsewhere
b=2
endwhere !用a数组对应位置内容的大小来给b数组赋值
4、FORALL 对部分数组操作
FORALL是FORTRAN95新加入的功能,但是这个功能更为强大,例如:
integer::a(10,5)
integer::I,J
......
......
forall(I=1:5,J=1:5,a(I,J)<10) !只处理数组小标在1~5范围而且元素内容小于10的元素
a(I,J)=1
end forall
同样的,与IF、WHERE相似的地方是,只有一行代码时候,可以省略end forall。
另外在FORALL中可以使用WHERE。
5、数组在内存中的存储规则
FORTRAN程序的数组元素在内存中按列保存,用二维数组A(3,4)来说明它在内存中的保存:
A(1,1)->A(2,1)->A(3,1) 先存第一列的各行元素
--->>A(1,2)->A(2,2)->A(3,2) 再存第二列
--->>A(1,3)->A(2,3)->A(3,3)
--->>A(1,4)->A(2,4)->A(3,4) 最后存储第四列
值得注意的是现在的计算机硬件结构中,会应用高速缓存Cache,当CPU使用数据时会先检查高速缓存中有没有这个数据,当没有时才会到存储器中拿数据,在拿数据的时候,不仅会拿所需的数据同时也会拿临近的数据,并把这列临近的数据存储在高速缓存中,如有CPU之后马上用到这些临近的数据会直接向高速缓存读取,这使得线性计算机的计算速度变得快,因此我们应该利用这个规则来安排数据的存放。
6、可变大小的数组
FORTRAN90比FORTRAN77功能强大的一点在于可以支持可变大小的数组,写法如下:
program ex0716
implicit none
integer::students
integer,allocatable::a(:) !声明一个可变大小的数组
integer::i
write(*,*) "How many students"
read(*,*)students
allocate(a(students)) !配置内存空间
......
end
另外释放空间可用DEALLOCATE。
当我们要检查一个变量是否已经被配置过内存空间时,可以用ALLOCATED函数,该函数返回一个逻辑值
if(.not.allocated(a)) then
allocate(a(5))
end if