从Python调用MATLAB函数

57

能否从Python中运行MATLAB函数? 我在网上搜索,只找到了PyMat。糟糕的是编译版本只支持Python2.2,而我使用的是2.6。因此我尝试下载源代码,以便自己编译。但我无法编译它,VC++ express似乎没有必要的功能来编译它。有人有计算机的编译版本吗? 或者有任何PyMat的替代品吗? 谢谢


8
当Matlab让你失望时,NumPy会成为你的好朋友。 - Simon Bergot
10个回答

33

我知道这是一个旧问题并且已经有答案了。但是我正在寻找同样的东西(用于Mac),发现有一些选项,具有不同的与matlab交互方法和不同的成熟度水平。以下是我发现的:

pymat

使用matlab引擎(libeng)进行通信的Matlab低级接口(基本上是一个随matlab一起提供的库)。该模块必须编译并链接到libeng。

http://pymat.sourceforge.net
最近更新:2003年

pymat2

pymat开发的某种短暂延续。似乎在Windows(包括64位)、Linux和Mac上都可以使用(需要一些更改)。

https://code.google.com/p/pymat2/
最近更新:2012年

mlabwrap

高级接口,也作为模块提供,需要编译并链接到libeng。它将Matlab函数公开给Python,以便您可以执行有趣的操作,例如

mlab.plot(x, y, 'o')

http://mlabwrap.sourceforge.net
最近更新:2009年

mlab

mlabwrap的重新打包努力。基本上,它使用Python模块(matlabpipe)替换了在mlabwrap中与libeng链接的C++代码,通过管道与Matlab通信。这样做的主要优点是不需要任何编译。

不幸的是,该软件包目前存在一些错误,在 Mac 上似乎根本无法正常工作。我报告了其中一些问题,但最终放弃了。此外,如果您必须进入源代码,请准备好进行许多欺骗和一堆相当丑陋的黑客攻击。如果这变得更加成熟,它可能是最好的选择之一。

https://github.com/ewiger/mlab
最近更新:2013年

pymatlab

一个较新的软件包(2010年),也通过libeng与Matlab交互。与其他软件包不同,该软件包通过ctypes加载引擎库,因此不需要编译。虽然它并不完美,但仍在维护中,并且我发现的(64位Mac特定的)问题应该很容易解决。
编辑于2014-05-20:看起来这些问题已经在源码中得到了解决,因此使用0.2.4应该没问题)

http://pymatlab.sourceforge.net
最近更新:2014年

python-matlab-bridge

也是一个较新的软件包,仍在积极维护。通过某种套接字与Matlab通信。不幸的是,公开的函数有些受限。我无法弄清楚如何调用带有结构参数的函数。需要zmq、pyzmq和IPython,这些都很容易安装。

http://arokem.github.io/python-matlab-bridge
最近更新:2014年


2
你的帖子很棒。虽然这个问题有些老,但仍然很重要。旧的答案已经过时了,因为在Matlab-Python交互方面还有很大的改进空间。 - Christian O'Reilly
1
为了更新旧答案以回答仍然相关的问题:自MATLAB 2014b以来,Mathworks已经包括了官方支持Python和MATLAB之间的通信:https://se.mathworks.com/help/matlab/matlab-engine-for-python.html - 5Ke

29

另一个选择是Mlabwrap

Mlabwrap是一个高级的Python到MATLAB®桥接器,使MATLAB看起来像一个普通的Python库。

它可以很好地处理numpy数组。以下是主页上的示例:

>>> from mlabwrap import mlab; from numpy import *
>>> xx = arange(-2*pi, 2*pi, 0.2)
>>> mlab.surf(subtract.outer(sin(xx),cos(xx)))

1
这个页面包含了使用mlabwrap的入门步骤。 - Amro
请注意,还有一个名为mlab的项目,它是“对 mlabwrap 的重新打包努力,以使其保持最新状态”。 - Florian Brucker
@FlorianBrucker:mlab 有些问题,至少对我来说它不能正常工作... - arc_lupus

26

看起来PyMat已经被放弃了。

我假设你正在使用Windows,所以你可以采用最简单的方法,使用Matlab的COM接口:

>>> import win32com.client
>>> h = win32com.client.Dispatch('matlab.application')
>>> h.Execute ("plot([0 18], [7 23])")
>>> h.Execute ("1+1")
u'\nans =\n\n     2\n\n'

更多信息请点击这里


嘿,有没有办法让Python脚本在MATLAB命令产生错误时停止运行或者打印出错误信息?我注意到Python默认情况下会忽略错误并继续执行脚本。-谢谢 - Usagi
这是Matlab的运行语句,可使用此命令运行可执行脚本吗? - girl101

10

有一个Python-Matlab桥接工具,其独特之处在于Matlab在后台运行,因此每次调用Matlab函数时都不需要启动成本。

https://github.com/jaderberg/python-matlab-bridge

只需下载并使用以下代码即可:

from pymatbridge import Matlab
mlab = Matlab(matlab='/Applications/MATLAB_R2011a.app/bin/matlab')
mlab.start()
res = mlab.run('path/to/yourfunc.m', {'arg1': 3, 'arg2': 5})
print res['result']

你的func.m文件的内容应该类似于这个样子:

%% MATLAB
function lol = yourfunc(args)
    arg1 = args.arg1;
    arg2 = args.arg2;
    lol = arg1 + arg2;
end

Max,你知道在Matlab函数中有没有一种方法可以传递多个参数而不使用字典吗?那将非常方便!谢谢! - Barmaley

3

它仅支持Python 2.6及以下版本吗? - gc5
1
@Francesco,抱歉我不知道!我只是两年前尝试了一些简单的例子。我一直在使用Matlab和Python。我只是坚持某些数据结构,并在它们之间传递数据。 - ying17zi

3

我想在Lukas的精彩总结中再添加一种选择:

matlab_wrapper

matlab_wrapper的优点是它是纯Python库,您不需要编译任何东西。适用于GNU / Linux,Windows和OSX。

https://github.com/mrkrd/matlab_wrapper

免责声明:我是matlab_wrapper的作者。


3
你可以通过安装Matlab并从其extern文件中构建Python引擎来使用官方Matlab引擎。您可以在以下指南网站中检查: ---感谢第一条评论中的建议--- 简要的关键步骤为(在Windows平台上,其他请参考以下网址): 1.下载并安装Matlab,版本必须是R2014或更高。 2.以管理员身份打开PowerShell窗口,然后:
cd "matlabroot\extern\engines\python"

3. 使用以下命令行安装:

python setup.py install

管理员是必不可少的,否则你将无法构建它。
如需了解更多信息,请单击下面的官方起始表: http://cn.mathworks.com/help/matlab/matlab_external/install-the-matlab-engine-for-python.html

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。-【来自审查】 - jezrael
@jezrael 谢谢您的建议,我会修改我的回答。 - H.S.Xu

2

较新版本的Matlab似乎提供了一个模块,允许你从Python中调用Matlab函数。请参见这里这里


我写了一个关于如何在类中使用它的教程 - http://www.cloud-rocket.com/2016/08/using-matlab-compiled-class-from-python/ - Meir Tseitlin

2

2
这是Mathworks提供的解决方案。
在当前文件夹中创建一个名为triarea.m的MATLAB脚本文件。
function a = triarea(b,h)
a = 0.5*(b.* h);

同时,您可以按照以下方式运行Python代码:
import matlab.engine
eng = matlab.engine.start_matlab()
eng.addpath('your/code/folders/')
ret = eng.triarea(1.0,5.0)
print(ret)
>>> 2.5

Matlab已经提供了Python的引擎模块,安装方法如下:

cd matlab_root_folder/extern/engines/python
python setup.py install

您已经完成了!提示:在处理数据时需要小心数据类型,引擎不友好numpy。您需要先转换数据。

mat_array = matlab.double(list(my_numpy_array))
eng.my_matlabe_function(mat_array )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接