在fortran中,我有一个外部优化例程,它将输入作为输入function f(x)和起点,并返回局部最小值.例如,如果该函数被称为最小值:
minimum(f,x0,xopt)
Run Code Online (Sandbox Code Playgroud)
问题是我需要最小化的函数取决于一些不属于最小化例程的其他参数:f(x,data).
我怎样才能克服这个问题.在matlab中我会使用匿名函数
g=@(x) f(x,data)
minimum(g, x0, xopt)
Run Code Online (Sandbox Code Playgroud)
然而,正如我在fortran 90中所理解的那样,没有匿名功能.
谢谢.
您不需要匿名函数.你的Matlab示例最后也不是匿名的,它有一个名字g.
Fortran内部函数在这里非常有用(Fortran 2008功能,但在gfortran和ifort中受支持,在Solaris Studio中不受支持):
call minimum(g, x0, xopt)
contains
real function g(x)
real, intent(in) :: x
g = f(x,data)
end function
end
Run Code Online (Sandbox Code Playgroud)
您从 MATLAB 得到的想法是正确的,您可以创建另一个f在封装时返回值的函数data。我想到了两个选择。
如果data在编译时修复,您可以包装f在使用它的模块中:
Module Foo
type(blah) :: data = ...
Contains
Real Function f(x)
! data is visible here.
End Function f
End Module Foo
Run Code Online (Sandbox Code Playgroud)
如果data通过用户输入或计算更加动态,您可以定义一个返回的函数data并从内部调用它f:
Real Function f(x)
...
Type(blah), Save :: data
Logical, Save :: data_not_loaded = .True.
If data_not_loaded Then
data = load_data(...)
data_not_loaded = .False.
End If
...
End Function f
Run Code Online (Sandbox Code Playgroud)
除了load_data()函数之外,您还可以创建一个类似注册表的子例程,首先设置data程序中较早的值,然后data从 中检索f。然而,逻辑f不会改变那么多。
可能还有一种使用过程指针的方法,但我从未在 Fortran 中使用过该功能,所以我可能是错的。