【问题标题】:Calling MATLAB functions from python从 python 调用 MATLAB 函数
【发布时间】:2010-05-21 15:01:23
【问题描述】:

是否可以在 Python 中运行 MATLAB 函数? 我搜索互联网,我只能找到 PyMat。不好的是编译后的版本只支持Python2.2,我用的是2.6。所以我尝试下载源代码,这样我就可以自己编译了。但我无法编译它,VC++ express 似乎没有编译它的必要功能。有人有PC的编译版本吗? 或 PyMat 的任何替代品? 谢谢

【问题讨论】:

  • 当 matlab 让你失望时,numpy 是你的朋友

标签: python matlab visual-c++


【解决方案1】:

我知道这是一个老问题,并且已经得到解答。但我一直在寻找相同的东西(对于 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 的重新打包工作。基本上,它用通过管道与 matlab 通信的 python 模块 (matlabpipe) 替换了与 mlabwrap 中的“libeng”链接的 c++ 代码。这样做的主要优点是它不需要任何类型的编译。

不幸的是,该软件包目前有几个错误,似乎根本无法在 mac 上运行。我报告了其中一些,但最终放弃了。此外,如果您必须进入源代码,请准备好应对大量诡计和一堆非常丑陋的黑客攻击;-) 如果这变得更加成熟,它可能是最好的选择之一。

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

pymatlab

一个较新的包 (2010),它也通过 libeng 与 Matlab 交互。与其他包不同,这个包通过ctypes 加载引擎库,因此不需要编译。它并非没有缺陷,但仍在维护中,我发现的(64 位 Mac 特定)问题应该很容易修复。
edit 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 年

【讨论】:

  • 为您的帖子+1。这个问题很老(正如你所说)但仍然相关。较旧的答案已经过时,因为 Matlab-Python 串扰还有很大的改进空间。
  • 本着更新旧答案的精神,回答仍然相关的问题:自 MATLAB 2014b 以来,Mathworks 已包含对 python 和 matlab 之间通信的官方支持:se.mathworks.com/help/matlab/matlab-engine-for-python.html
【解决方案2】:

另一个选项是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)))

【讨论】:

  • page 包含开始使用mlabwrap 的步骤
  • 请注意,还有mlab,“[mlabwrap] 的重新包装工作,以使事情保持最新状态”。
  • @FlorianBrucker:mlab 不知何故坏了,至少它对我来说不能正常工作......
【解决方案3】:

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'

更多信息here

【讨论】:

  • 嘿,如果 MATLAB 命令产生错误甚至打印出错误,有没有办法让 Python 脚本停止?我注意到 Python 默认会忽略错误并继续执行脚本。 -谢谢
  • 是matlab的run语句用这个命令运行一个脚本可执行文件吗?
【解决方案4】:

有一个 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']

yourfunc.m 的内容是这样的:

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

【讨论】:

  • Max,您知道是否有一种方法可以在不使用字典的情况下将多个参数传递给 matlab 函数?那将非常方便!谢谢!
【解决方案5】:

【讨论】:

  • 是否只支持python 2.6?
  • @Francesco,对不起,我不知道!大约两年前,我刚刚尝试了一些简单的例子。我一直在使用matlab和python。我只是坚持某些数据结构,并在它们之间传递数据。
【解决方案6】:

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

matlab_wrapper

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

https://github.com/mrkrd/matlab_wrapper

免责声明:我是 matlab_wrapper 的作者

【讨论】:

    【解决方案7】:

    您可以通过安装 Matlab 来使用官方的 matlab 引擎,然后从其外部文件构建 python 引擎。您可以查看以下指南网站: ---感谢此答案第一条评论中的建议--- 简要的基本步骤是(在 Windows 平台上,其他可以在下面的 url 中检查): 1.下载并安装matlab,版本必须是R2014或更高版本。 2.在admin下打开一个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

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • @jezrael 谢谢你的建议,我会修改我的答案
    【解决方案8】:

    较新版本的 matlab 似乎提供了一个模块,允许您从 python 中调用 matlab 函数。见herehere

    【讨论】:

    【解决方案9】:

    另外 2 个选项供您考虑:

    1. 关注 MATLAB 官方文档: Create a Python Application with MATLAB Code。这将创建一个包含 MATLAB 运行时的 Python 库,您可以在 Python 代码中调用该库。

    2. GNU Octave 中运行您的 MATLAB 代码,然后使用 Oct2Py 从 Python 调用它

    【讨论】:

      【解决方案10】:

      这是 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
      

      你已经完成了! Tips:需要注意数据类型,引擎对numpy不友好。您需要先转换数据。

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

      【讨论】:

        猜你喜欢
        • 2010-12-15
        • 2015-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多