繁体   English   中英

调用一个 python 函数,该函数将 MATLAB 函数句柄作为来自 matlab 的参数

[英]Call a python function that takes in a MATLAB function handle as argument from matlab

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

我怀疑你想要的不能直接完成。

首先,如果你传递一个 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。

另请注意,虽然在限制中没有明确提到缺乏 MATLAB 函数句柄支持,但详细说明支持的数据类型的文档部分做出了以下评论:

MATLAB 输入参数类型 - 仅限标量值
函数句柄@py。 module.function ,仅适用于 Python 函数

Python 函数的区别在于,即使是最简单的 Python 函数也拒绝接受 MATLAB 函数句柄。

我们可以尝试将您的 MATLAB 匿名函数转换为 python 函数,但我必须事先说明它很混乱,如果我是您,我会避免这样做。 由于 lambdas 不是由 MATLAB 的 Python API 直接公开的:

>> py.lambda
Unable to resolve the name py.lambda.

我们不得不求助于使用 python lambda 调用 Python 的eval (因为exec似乎也没有暴露):

>> py_f = py.eval('lambda x: x**2', py.dict());
>> py_f(3)

ans =

     9

感谢@yuyichao通过指出需要传递的缺少的globals字典来修复我的这个片段。)


然而,一个简单的问题是:你真的需要一个 MATLAB 匿名函数吗? 您也可以使用适当的 python 函数(或 lambda)并将其他可能的参数作为args传递给底层scipy.optimize函数。 您可以在 python 文件中定义自定义函数,然后从 MATLAB import它并使用相应的函数句柄。 这可能是最直接的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM