在Python脚本中调用MATLAB的.m文件和函数

9
我有一个用于Python脚本编写的平台,我希望能在其中调用Matlab函数。我找到了几个讨论这个问题的线程,其中包括以下两个链接:

如何从Python中与MATLAB进行交互?

从Python运行.m文件

然而,这些线程要么不够详细,要么过时了。

  1. mlabwrap可靠吗?
  2. 您会推荐什么解决方案来在Python脚本中调用Matlab函数/.m文件?
  3. 使用Python中的win32com调用Matlab会怎样?这是个好主意吗?您能否提供更多关于此主题的文档或示例?

看起来源Forge的链接已经过时了,最后一次更新是在2010年。

http://sourceforge.net/projects/mlabwrap/

  1. 您能提示一些最新版本的信息吗?

谢谢。


虽然 mlabwrap 已经有一段时间没有更新了,但是仍然有几个非常近期和非常积极的评论。因此,我认为推荐仍然有效。 - Dennis Jaheruddin
@FredrikRedin 什么都没有:我的工作站上没有Matlab。这是一个普遍的问题。 - kiriloff
看起来是 https://dev59.com/QXE85IYBdhLWcg3wNw14 的部分重复。 - Yauhen Yakimovich
4个回答

7
我仍然建议使用mlabwrap作为解决方案。我经常(每周?)在Linux和Windows上使用mlabwrap,在几个不同版本的Python和Matlab上使用它。回答您的具体问题: 1. mlabwrap可以可靠地跨平台、Python和Matlab版本执行。但是它有一些限制,当超出这些限制时,它会可靠地失败。通常,这些可以解决。 2. 有关通过mlabwrap调用Matlab函数与Matlab脚本的更多信息,请参见我的答案here。此答案还描述了如何解决mlabwrap的主要限制之一,即并非所有Matlab对象都可以直接转换为Python对象。 3. 我不知道如何使用win32com调用Matlab。
我已经以“Python-primary”风格和“Matlab-primary”风格使用过mlabwrap。在“Python-primary”风格中,大部分编程使用Python完成,使用Matlab作为库来处理一些在scipy/numpy中不可用的数学函数;在“Matlab-primary”风格中,大部分编程是在Matlab中完成,并将最终结果导入Python以供外部进程使用。
对于Python主要的问题,需要记住的是并非所有Matlab函数都会返回Python可读取的数据。在这些函数中,mlabwrap将返回一个MLabObjectProxy对象。当您使用Matlab函数创建对象并将其传递到其他Matlab函数来实际处理数据时,通常会出现这种情况。例如,您可以使用数字信号处理工具箱创建一个Welch频谱对象,然后使用它来获取您的数据的功率谱。理论上,您可以将这些MLabObjectProxies传递给需要它们的Matlab函数。根据我的经验,您传递得越多,就越有可能在mlabwrap中发现错误。相反,您可以编写一个简单的Matlab包装函数,获取对象、处理数据,然后将适当的输出作为数组返回。
您还可以通过使用mlabwrap中的低级命令来解决MLabObjectProxies的问题。例如,如果我有一个matlab_struct是一个带有字段matlab_struct.label的结构体数组,而我只想在Python端获取标签,我可以执行以下操作:
# place matlab_struct into the Matlab workspace 
mlab._set('matlab_struct', matlab_struct) 
# convert the labels into a cell array
matlab_struct_labels = mlab.eval('{matlab_struct.labels}')

主要的低级命令包括mlab._set('variable_name', variable)mlab.eval('command string')mlab.get('variable_name')
如果我在Matlab中进行大量的重度处理,比如在一个工具箱或插件中,那么我会编写我所谓的“Matlab-primary”代码,尽量避免通过mlabwrap来回传递数据,而是通过调用.m脚本在Matlab工作区中操纵变量,将结果输出到数据文件中,并将其导入到我的Python代码中。
祝你好运!

3

mlabwrapper

是Python和MATLAB之间桥接的一个很好的解决方案。如果有什么问题,请在SO上报告具体的问题 :)

你需要注意,mlabwrapper作为项目已经存在了相当长的时间。http://mlabwrap.sourceforge.net/

我最近遇到了mlabwrap.cpp的问题,我找到了以下的github分支

相关的Thereis是一个mlabwrap v1.1-pre的副本 (http://mlabwrap.sourceforge.net/),如下所述进行了修补: http://sourceforge.net/mailarchive/message.php?msg_id=27312822

使用一个修补程序来修复错误:

mlabraw.cpp:225: error: invalid conversion from ‘const mwSize*’ to ‘const int*’ 另外请注意,在Ubuntu中您需要sudo apt-get install csh

详情请参见http://github.com/aweinstein/mlabwrap

mlab

花费更多时间后,我制作了一个GitHub镜像来更新、修复和维护这个包装器https://github.com/ewiger/mlab (欢迎使用补丁和pull-requests!)

它可以通过pip安装,例如:

pip install mlab

我现在暂时排除了cpp实现。当前的方式如下:
对于Linux/Mac库,它会创建与MATLAB实例的管道连接,其余部分使用numpy进行序列化(部分由@ brentlance指出)。
对于Windows库,它使用DCOM进行通信。(但我仍然需要修复使用注册表进行版本查找)。
何时使用mlab?
我建议调用MATLAB中非常高级别的用户函数(主要返回逻辑结果或非常标准的内置类型,如矩阵),以最小化与MATLAB的任何通信。这种方法非常适合旧代码,但可能需要编写一些包装接口来简化函数声明。
总体而言,该代码有点冗长,是许多补丁拼凑而成的。核心部分(现在是matlabpipe和matlabcom)似乎做得很好。最终,我不建议在生产应用中完全使用mlab,除非你愿意花时间测试、报告错误、修复错误并请求所有用例的功能。

1

回答您的问题:

  1. 我们使用了mlabwrap,它很可靠。唯一的困难是编译它。我们在这方面遇到了一些问题。但是一旦你编译好了它,它运行得很好。
  2. 我推荐使用matlab_wrapper,因为它更容易安装(纯Python,无需编译),支持各种数据结构(数值、逻辑、结构体、单元数组)并且可以在GNU/Linux、Windows、OSX上运行。
  3. 使用win32com与MATLAB通信应该是可行的,但它相当低级且不可移植。

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


0
自从MATLAB R2014b以来,现在有一个Python的MATLAB API。有关更多信息,请参见MATLAB 文档。但是,它需要启动MATLAB引擎,这可能需要一些时间。

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