如何从 Python 与 MATLAB 交互?

Posted

技术标签:

【中文标题】如何从 Python 与 MATLAB 交互?【英文标题】:How do I interact with MATLAB from Python? 【发布时间】:2011-01-16 09:21:52 【问题描述】:

一位朋友问我关于创建一个小型 Web 界面,该界面接受一些输入,将它们发送到 MATLAB 进行数字运算并输出结果。我是一名 Python/Django 开发人员,所以我可以处理 Web 界面,但对于 MATLAB,我一无所知。具体来说:

真的希望避免将其托管在 Windows 服务器上。使用在 Windows 上创建的脚本在 Linux 中运行 MATLAB 是否有任何问题? 我是否应该研究出命令或将其编译为 C 并使用 ctypes 与之交互? 如果编译是要走的路,关于如何编译它并在 Python 中工作,我应该知道什么吗? (我已经很长时间没有编译或使用 C 语言了)

关于如何实现这一点的任何建议、提示或技巧?

【问题讨论】:

请注意,这将违反 MATLAB 许可证。也许如果你在大学里,你会侥幸成功,但对于 MATLAB,你需要为每个最终用户——即使用你的网络界面的每个人——提供一个许可证。我试图设置一些计算网络服务,我们被告知这个要求 - 最后我们不得不使用 Matlab 编译器来创建一个没有这个限制的独立可执行文件(或完全切换到 Python - Numpy/Scipy/Matplotlib提供一个相当全面的替代品)。 【参考方案1】:

作为替代方案,从 Matlab R2014b 开始,提供了一个 Python 库,用于使用 MATLAB Engine API for Python 从 Python 调用 Matlab。

【讨论】:

【参考方案2】:

看看mlabwrap,它允许您通过python API调用Matlab

【讨论】:

我第二次使用 mlabwrap。虽然,我更喜欢像 numpy 这样的纯 Python 解决方案,但我目前正在使用 mlabwrap 从文件中读取一些数据,在 Python 中对其进行预处理并将其发送到 Matlab,然后得到结果。每次请求到来时,您可能会遇到启动 Matlab 环境的开销问题。 我也同意 mlabwrap 非常容易使用。但是,正如 Amac 所说,开销非常大。为了给出一些数字,我正在使用的计算(函数优化.lsqlin)在从 matlab 调用它时需要 0.01 秒才能完成,但是当使用 mlabwrap 从具有相同参数的 python 调用它时,它需要 0.30 秒才能完成。 【参考方案3】:

有一个 python-matlab bridge 是独一无二的,因为 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

【讨论】:

【参考方案4】:

关于操作系统的兼容性,如果你使用 Linux 的 matlab 版本,用 windows 编写的脚本应该可以在没有任何更改的情况下运行。 如果可能的话,你也可以考虑用 python 做所有事情的可能性。带有 Matplotlib 的 Scipy/numpy 提供了一个完整的 Matlab 替代品。

【讨论】:

以上是关于如何从 Python 与 MATLAB 交互?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用与同一数据库交互的外部 python 包来构建 Django 项目

Python 如何与 Spark 中的 JVM 交互

如何从 IDLE 交互式 shell 运行 python 脚本?

Python 交互式选择工具,例如 MATLAB

如何在Python交互模式中运行.py文件

py4j:如何从 Python 启动 java 网关