内置函数

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计算数组的最大公约数,最小公倍数