首页 > 解决方案 > 使用 Python 列表作为 Python 中 Matlab 函数的输入

问题描述

我有一个 Matlab 函数 M 文件,名为func. 这需要一个数字作为输入,并输出一个数字。

我想在 Python 中使用此代码,在 Python 中获取输出,并使用它在 Python 中创建可视化。我正在使用matlab_engine并且我想为从 0.1 到 500.0(0.1 步)的每个值运行此函数,并在 Python 中记录每个值的输出。

为此,我创建了一个从 0.1 到 500.0 的 numpy 数组,将其转换为列表,然后将此列表转换为数据类型为 double 的 Matlab 数组。然后我尝试使用arrayfun以数组A作为输入来调用函数,但我一直遇到错误。

到目前为止,这是我的 Python 代码:

import numpy as np
import matlab.engine as me
import matlab as mat

eng = me.start_matlab()

eng.cd(r'/Users/talha/Documents/Sem1/Topics')

array = np.arange(0.1, 500.1, 0.1).tolist()

A = mat.double(array)

x = eng.arrayfun(f,A)
print(x)

我得到错误:NameError: name 'func' is not defined

在matlab函数结束之前,我添加了这一行f = @func

我也试过

x = eng.arrayfun(eng.func,A) print(x)

但我得到了错误TypeError: unsupported Python data type: matlab.engine.matlabengine.MatlabFunc

我在这里做错了什么?是否有更简单的方法来做到这一点?

标签: pythonarrayslistmatlab

解决方案


在 的文档中matlab.engine,没有提到我能找到的函数句柄。这让我相信直接在 Python 中创建一个是不可能的。eng.func是一个 Python 函数,调用它会导致 MATLAB 引擎运行 MATLAB 函数func。但eng.func不是 MATLAB 函数句柄,它是 Python 函数的名称。

MATLAB 函数str2func根据函数名称的字符串表示形式创建函数句柄。在 MATLAB 中,str2func('func')返回与@func. 我们可以从 Python 调用这个函数来获得一个 MATLAB 函数句柄:

import matlab.engine as me

eng = me.start_matlab()

# ...

f = eng.str2func('func')
x = eng.arrayfun(f, A)

推荐阅读