Fortran矩阵运算
Fortran最强大的莫过于矩阵运算了,Fortran90标准中允许对数据进行整体操作,这样不仅能加快代码执行效率,还能减少代码量,例如:
1 | 1 integer :: var1(3), var2(3), var3(3) = [1,2,3] |
上述代码定义了3个数组var1、var2和var3,并将var3进行了初始化。第二行代码将var3整体乘以3并赋值给了var1,第三行将var3整体都加了5并赋值给var2,第四行将var1和var2逐个元素相乘并赋值给了var3。我若想让变量刚开始初值为0,则可以简单的令var1=0就可以实现了,而不需要写一个循环,逐个初始化。感叹号 ! 是代码注释标识,Fortran没有像C/C++中一样的块注释(/* */)。另外老代码中的注释标识为c、C(因为不区分大小写)和 * ,这些都是不提倡的,在自由格式中运用这些字符注释,编译器是不会正常识别的。
指针操作数组
Fortran中的指针可以实现数组中某一块的读取,例如:
1 | 1 real, dimension(:), pointer :: p1, p2 |
上述定义了一个指针数组和一个含有10个元素的一维数组,第四行将指针数组指向了var的第2到第4个元素,相当于执行了(p1(1)=>var(2),p1(2)=>var(3),p1(3)=>var(4)),改变p中元素的值就会同时改变var中的值,这要设置的好处就是可以把数据中某一块拿出来单独进行计算。甚至可以不连续的读取数组中的元素,如第五行所示。这里相当于执行了(p2(1)=>var(1),p2(2)=>var(3),p2(3)=>var(5))。两个冒号n: m :k,头一个数字n是引用数组指标开始的地方,第二个数字m是结束的地方,第三个数字k是步长。当不需要这个指针的时候,另外可以用函数nullify解除指针的绑定,将其指向一个不能使用的内存地址。另外用可以用associated函数来检测指针是否已经有了指向一个对象,或者有没有指向,若有则返回.true.,否则返回.false.。
写在最后
Fortran中还可以使用equivalence函数实现变量共享内存,如下:
1 | real :: a, b |
这里也是不建议使用的。另外需要说明的一点就是,关于变量的声明必须要放在程序的前方,也就是紧接在implicit none的后面,Fortran是不支持随时随地定义变量的,这里是和C/C++有区别的。