在fortran 90中,如何在matlab中编写等效的句柄

时间:2014-06-24 16:40:33

标签: matlab fortran handle

我有一个Fortran90函数f(a,b)。我需要使用需要函数g(a)的一维根查找器,只有一个变量a,以找到各种b值的f的根。

在Matlab中,我可以使用参数b,

构建一个只有一个变量a的新函数g
g = @(a) f(a, b);

b是一个可以在主程序中更改的参数,其范围也在f中。

如何在Fortran 90或95中执行此操作?

3 个答案:

答案 0 :(得分:0)

简单:使用包装功能...如果这是您的原始功能f

integer function f(a,b) 
  implicit none
  integer,intent(in) :: a, b

  f = a + b
end function

你可以将它包装成一个带有常量wrapper_fct的单参数函数b1,如下所示:

integer function wrapper_fct(a)
  implicit none
  integer,intent(in) :: a
  integer,parameter  :: b1 = 10

  wrapper_fct = f(a, b10)
end function

或者,甚至更简单:

integer function wrapper_fct(a)
  implicit none
  integer,intent(in) :: a

  wrapper_fct = f(a, 10)
end function

答案 1 :(得分:0)

包装器的快速而肮脏的示例如下:

program omhulsel
implicit none

print *, 'f(1.,2.,3.) = ', f(1.,2.,3.)
print *, 'g(1.) = ', g(1.)
print *, 'g(1.,2.,3.) = ', g(1.,2.,3.)
print *, 'g(1.) = ', g(1.)
print *, 'g(1.,b=0.) = ', g(1.,b=0.)

contains

real function f(x,y,z)
  real :: x, y, z
  f = x**2 + y**2 + z**2
end function

real function g(x,a,b)
  real :: x
  real, optional :: a, b
  real :: par_a = 0, par_b = 0
  if (present(a)) par_a = a
  if (present(b)) par_b = b
  g = f(x,par_a,par_b)
end function

end program

函数g保留其参数par_apar_b(它们获取SAVE属性),也可以通过传递可选参数来修改。

答案 2 :(得分:0)

你可以按如下方式处理,虽然它不完全等同于matlab的函数句柄(函数在Fortran中并不是真正的一等公民)。

module roots
  implicit none

contains

  subroutine root_finder(f,b)
    procedure(func) :: f
    real, intent(in) :: b

    abstract interface
      real function func(a,b)
        real, intent(in) :: a,b
      end function
    end interface

    print*, g(2.)

  contains

    real function g(a)
      real, intent(in) :: a
      g = f(a,b)
    end function    
  end subroutine
end module

如您所见,两个变量的函数与参数b一起传递给子例程。子例程使用内部函数g(a)来评估f(a,b)。这个函数就是"句柄"。

示例程序,它定义实际函数f(a,b) = a**2 + b

program example
  use roots
  implicit none    
  call root_finder(f, 10.)
contains
  real function f(a,b)
    real,intent(in) :: a,b
    f = a**2 + b
  end function
end program

输出:14.0000000