最近一个工程中要调用一个matlab的大函数,实在是不想重新写,就简单的用python调用了matlab。
- 版本匹配
我用的环境是Python 3.6.6 matlab 2018b,python的版本和matlab的版本必须匹配,在matlab 2018b中支持的python版本是3.4 3.5 3.6,2.7支不支持暂时没查到。
要是不清楚你的matlab版本支持的python版本的话,接下来我们会谈到
安装用于 Python 的 MATLAB 引擎 API ww2.mathworks.cn
这是官方的一个教程,其中提到:
在安装之前,确认您的 Python 和 MATLAB 配置。
您的系统具有受支持的 Python 版本和 MATLAB R2014b 或更新版本。要检查您的系统上是否已安装 Python,请在操作系统提示符下运行 Python。
将包含 Python 解释器的文件夹添加到您的路径(如果尚未在该路径中)。
找到 MATLAB 文件夹的路径。启动 MATLAB,并在命令行窗口中键入 matlabroot。复制 matlabroot 所返回的路径。
2. 安装
在上一部找到的matlabroot路径中,执行以下操作
在 Windows 系统中 –
cd "matlabroot\extern\engines\python"
python setup.py install
在 Mac 或 Linux 系统中 –
cd "matlabroot/extern/engines/python"
python setup.py install
如果在conda里面安装的话,请提前启动conda环境。
注意此步需要管理员权限的CMD,如果没有的话,参照此文:
在非默认位置安装用于 Python 的 MATLAB 引擎 API ww2.mathworks.cn
如果import matlab.engine时出现了ImportError: No module named matlab.engine,参考
Python和matlab混编时,遇到问题:ImportError: No module named matlab.engine”的解决方法 blog.csdn.net
总结就是
python setup.py build --build-base="builddir" install
python setup.py install --prefix="installdir"
python setup.py build --build-base="builddir" install --prefix="installdir"
python setup.py install --user
3. 调用
一定要在python中先写入
import matlab
import matlab.engine
尝试过只import matlab然后调用matlab.engine然后报错了,其中matlab是用来做数据转换等工作,matlab.engine是用来调用函数的。
所有要送给python中调用的matlab的数据,需要使用matlab(就是刚刚import的)转换,如:
MATLAB 数组作为 Python 变量 ww2.mathworks.cn
比较有趣的是有一点,即使是数值,而非序列需要传送给matlab的函数,也需要用list或者tuple包一下才可以。
initializer
必须是 Python 序列类型,例如
list
、
tuple
或其他序列类型。可选的
size
输入参数根据序列来设置数组大小
对于complex也有专门的方法转换,这个我没试过,不过官方说明有提到:
您可以通过指定
initializer
包含多个数字序列或通过指定
size
为多维来创建多维数组。通过将可选的
is_complex
输入参数设置为
True
,可以创建复数 MATLAB 数组。
matlab
包提供了下表中列出的 MATLAB 数组构造函数
matlab函数在python调用中,首先需要启动一个engine,通过engine去启动matlab函数,也可以启动多个引擎来,启动多个计算,也可以使用非同步启动等方式,在官网中都有说明:
启动和停止用于 Python 的 MATLAB 引擎 ww2.mathworks.cn 使用完了关闭就是了
使用完请通过eng.exit()停止,我用的eng.quit()总会报错。
Matlab输出的数据也是matlab自己的一个object,需要通过numpy转换回来,这点也要注意下
另外一些有用的信息如下:
指定输出个数
默认情况下,API认为接收函数返回结果的参数有1个。这会导致没有返回值的函数在被调用时报错:“Too many output arguments”或是其他类似的信息。我们可以人为指定输出参数为0个来避免这样的错误。
>>> playblocking(player) # playblocking is a MATLAB function with no returns
Error using playblocking
Too many output arguments
>>> playblocking(player, nargout=0)
# Success!
123456
来源: