python中调用matlab

最近一个工程中要调用一个matlab的大函数,实在是不想重新写,就简单的用python调用了matlab。

  1. 版本匹配

我用的环境是Python 3.6.6 matlab 2018b,python的版本和matlab的版本必须匹配,在matlab 2018b中支持的python版本是3.4 3.5 3.6,2.7支不支持暂时没查到。

要是不清楚你的matlab版本支持的python版本的话,接下来我们会谈到

安装用于 Python 的 MATLAB 引擎 APIww2.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 引擎 APIww2.mathworks.cn

如果import matlab.engine时出现了ImportError: No module named matlab.engine,参考

Python和matlab混编时,遇到问题:ImportError: No module named matlab.engine”的解决方法blog.csdn.net《python中调用matlab》

总结就是

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

来源:

如何在Python中调用MATLAB – OddNo77的博客 – CSDN博客blog.csdn.net《python中调用matlab》

    原文作者:戚少商
    原文地址: https://zhuanlan.zhihu.com/p/47655091
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞