如何从Python中与MATLAB交互?

24

一个朋友询问我关于创建一个小型的Web界面,接受一些输入数据,将其发送给MATLAB进行计算,并输出结果。我是一名Python / Django开发人员,可以处理Web界面,但是当涉及到MATLAB时,我就不知道该怎么办了。具体来说,有以下问题:

  • 非常希望避免在Windows服务器上托管此应用程序。在Linux上运行MATLAB并使用Windows创建的脚本是否会存在问题?
  • 我是否应该研究外壳命令或编译成C并使用ctypes与之交互?
  • 如果编译是正确的方法,那么我需要了解有关如何在Python中编译和使用它的任何信息吗?(自从我编译或使用C以来已经过了很长时间)

有什么建议、技巧或窍门可以完成这件事吗?


7
请注意,这将违反MATLAB许可证。也许如果你在大学里,你可以逃脱惩罚,但对于MATLAB,你需要为每个最终用户获取一个许可证——也就是使用你的web界面的所有人。我曾试图设置一些计算Web服务,我们被告知有此要求——最终我们不得不使用MATLAB编译器创建独立执行文件,这样就没有这个限制了(或者完全转向Python——Numpy/Scipy/Matplotlib提供了相当全面的替代方案)。 - robince
4个回答

18

有一个Python-MATLAB桥接器,它的独特之处在于MATLAB作为服务器在后台运行,因此每次调用MATLAB函数时不需要启动成本。

下载并使用以下代码非常简单:

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

13

可以看看 mlabwrap 这个工具,它允许你通过 Python API 调用 Matlab。


1
我也支持使用mlabwrap。虽然我更喜欢像numpy这样的纯Python解决方案,但目前我正在使用mlabwrap从文件中读取一些数据,在Python中预处理后发送到Matlab,然后获取结果。每次请求时启动Matlab环境可能会导致一些开销问题。 - Ruggiero Spearman
2
我也同意mlabwrap非常容易使用。然而,正如Amac所说,开销相当大。为了说明这一点,我正在使用的一个计算(函数optimization.lsqlin)在从matlab调用时需要0.01秒才能完成,但是当使用相同参数从python调用mlabwrap时,需要0.30秒才能完成。 - Spike

6

1
关于操作系统的兼容性,如果您使用的是Linux版的Matlab,那么在Windows上编写的脚本应该可以直接运行而无需进行任何更改。 如果可能的话,您也可以考虑使用Python来完成所有的工作。Scipy/numpy和Matplotlib提供了完整的Matlab替代方案。

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