我正在尝试使用MATLAB环境中的scipy.optimize.differential_evolution
(python)。
到目前为止,我已经可以调用differential_evolution
函数。唯一的问题是它显然无法接受MATLAB函数句柄作为参数。
我收到以下错误:
使用py.scipy.optimize.differential_evolution处理MATLAB时出错 不支持函数'@(x)x(1)。^ 2. * x(2)。^ 2'。使用手柄 Python函数。
是否有一些简洁的方法或函数可以将MATLAB函数句柄“转换”为python函数,以便可以使用scipy中的简洁优化函数?
答案 0 :(得分:1)
我不确定,但我怀疑您想要做的事无法完成。
首先,如果您将其传递给MATLAB匿名函数,则python界面中的任何内容都会给您该错误:
>> py.print(@(x) x)
Error using py.print
Handle to MATLAB function '@(x)x' is not supported. Use a handle to a Python function.
因此,似乎引擎意味着它,您必须放弃MATLAB函数。我们可以尝试将您的匿名函数转换为python函数...但是我不知道这怎么可能。我怀疑根本不可能,因为最直接,最简单的自定义函数是lambda。但是py.lambda
不存在,我们甚至无法通过调用py.eval
来愚弄MATLAB引擎:
>> py.lambda
Undefined variable "py" or class "py.lambda".
>> py.eval('lambda x: x')
Python Error: SystemError: frame does not exist
>> py.eval('def foo(x): return x')
Python Error: SystemError: frame does not exist
这非常有力地表明,一旦拥有MATLAB匿名函数,就无法将其转换为python函数。
直接的问题是:您真的需要MATLAB匿名函数吗?您也可以使用适当的python函数(或lambda),并将可能的其他参数作为scipy.optimize
传递给基础args
函数。您可以在python文件中定义自定义函数,然后在MATLAB中import
定义自定义函数,并使用相应的函数句柄。这将是您摆脱困境的直接方法。
还请注意,尽管缺少MATLAB函数句柄支持is not explicitly mentioned among the limitations,但section of the documentation detailing supported data types表示了这一点:
MATLAB输入参数类型-仅标量值
函数句柄@py。 module.function ,仅适用于Python函数
Python函数的区别与以下事实相符:即使最简单的Python函数也拒绝接受MATLAB函数句柄。