内置函数
Fortran中提供了大量的内置函数,熟练使用这些内置函数,可以有效提高写代码的效率。
所有的内置函数均可以在
大部分用于数和数组类型的函数都是逐元函数,可以同时接收标量和数组。
一些易错点
内置函数中有一些易错点,有一些属于设计缺陷。
-
cmplx(a [,b] [,kind])
函数,cmplx
函数用于构造一个复数,但是在实际的计算中,cmplx(1.0_8,1.0_8)
的返回值并不是一个complex(8)
的类型,而是一个complex(4)
的类型,cmplx(1.0_8,1.0_8,8)
这样才能返回合适的类型。 -
minloc(array [,dim] [,mask])
,maxloc(array [,dim] [,mask])
,这两个函数用于返回数组中最小值,最大值的位置。当你传入的是一个一维数组的时候, 它实际的返回值式integer::idx(1)
类型,是一个数组而不是一个数。minloc(array,dim=1)
这样写可以返回一个数。 -
dot_product(a,b)
这个函数用于计算两个一维数组的内积,需要注意的是,当传入的是complex
类型的时候,它实际上计算的是\(a^{H}b\)而不是\(a^{T}b\) -
reshape,mamtul
这些返回数组的内置函数,在ifort/ifx
中优化很差,会造成栈溢出stack overflow
,需要谨慎使用。 -
reduce
,reduce
接收一个数组,并对数组元素做相对应的规约操作(目前仅ifx/ifort
支持)规约操作是指对于矩阵
a
和运算f(x,y)
,假设有初始值id
do i=1,n id = f(id,a(i)) end do
例如计算一个数组的模
program main implicit none write(*,*)reduce([real::1,2,3],add_pow) contains pure real function add_pow(x,y)result(f) real,intent(in)::x,y f=sqrt(x**2+y**2) end function add_pow end program main
- 练习:查询相关函数的文档,思考如何计算一个数组的模平方
- 练习:使用reduce计算数组的最大公约数,最小公倍数