调用一个将MATLAB函数句柄作为Matlab参数的python函数

时间:2018-08-16 21:13:40

标签: python matlab function arguments

我正在尝试使用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中的简洁优化函数?

1 个答案:

答案 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函数句柄。