数组操作 from《FORTRAN95 程序设计》

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值