Python调用MATLAB常见问题与mlab、engine对比

Mia
Mia
发布时间:2026-10-15 | 2人浏览过
原创

本文详细解析Python调用MATLAB的两种主要方式:mlab库与官方matlab.engine。对比指出mlab虽自动转换数据类型但存在自定义函数无法热更新的严重Bug;engine为官方推荐方案,需正确配置路径并处理变量类型对应。文章提供了安装步骤、参数传递技巧及解决“Too many output arguments”错误的实用建议,帮助开发者高效结合Python数据结构与MATLAB矩阵计算优势。

为什么要用python调用matlab?

在处理涉及哈希查找的数据结构时,Python中Key通常为元组形式,而MATLAB中支持哈希查找的数据结构仅有containers.Map(),且不支持以Cell作为Key。

曾尝试将向量转换为字符串,但num2str和str2mat效率较低,导致containers.Map()查找耗时过长,因此该方法不可行。

随后发现可通过Python调用MATLAB API直接参与运算,据经验,将矩阵运算交由MATLAB处理可显著提升速度。

在摸索过程中发现若干网络资料中未提及的问题,通过自行实践找到解决方案,整理如下,希望能对读者有所帮助。

配置python以调用matlab的API

python环境

本文以py2.7及Spyder环境的Anaconda为例进行说明。

通过mlab库

该包可直接从官网下载,也可尝试使用pip安装(具体安装过程已记不清)。

安装完成后,使用示例如下:


from mlab.releases import latest_release as matlab
import os
path = os.getcwd()
mat.path(mat.path(),path) # 添加当前脚本所在路径到matlab的环境中
......

所有MATLAB函数(含自定义函数)均可通过matlab.xxxx()的方式调用。

mlab包的优点

MATLAB中的所有变量均为矩阵形式,传入Python后会自动转换为numpy的array形式,使用十分便捷。

mlab包的缺点

这是最大的BUG!自定义函数通过mlab在Python中调用后,仿佛被编译为只读状态,此后对.m文件的任何修改均无效。无论是重启Python kernel、重启Spyder、重新import mlab,还是删除.m文件重建同名函数,均无法解决。若删除.m文件,Python会报错;除非重新命名一个新函数进行调用,但该新函数同样面临无法修改的问题。

唯一解决办法是重启电脑。

因此,我选择了另一种方式,这也是MATLAB官网推荐的方法。

通过matlab.engine

MATLAB官网链接:MATLAB API for Python。

安装过程:

1、在MATLAB安装路径中,找到”R2016b\extern\engines\python”,每个人安装路径不同,只需找到末尾一致的路径即可。

2、注意区分,通过Anaconda Prompt打开命令行,依次执行:d: –>cd D:\Program Files\MATLAB\R2016b\extern\engines\python,即切换路径到MATLAB的python的setup.py目录下。

3、官方提供了较完整的安装方案,按步骤操作即可:在非默认位置安装用于 Python 的 MATLAB 引擎 API。

4、安装完成后,可在Python中测试以下内容:


#coding=utf-8
import matlab.engine
from numpy import *
if __name__ == '__main__':
 eng = matlab.engine.start_matlab()
 A = matlab.double([[1,2],[5,6]])
 print(type(A),A.size,A)
 print(eng.eig(A))
 eng.quit()
 pass

matlab.engine包的优点

这是MATLAB官方介绍的方法,不会出现mlab那种问题,可以边写程序边调试,无此限制。

matlab.engine包的缺点

使用的变量中包含许多MATLAB类,其中一些在Spyder的Variable explorer中无法显示,必须手动打印。

另外,必须注意Python变量类型和MATLAB变量类型的对应关系,MATLAB提供了一张表:Pass Data to MATLAB from Python。

我习惯将变量以list形式[1,2,3]传入MATLAB函数,此时MATLAB内部将其视为Cell。调试中多次遇到此问题,实际上若仅传数值到函数中,需要在Python中将变量设置为matlab.double([1,2,3])传入才能正常运行。

实用建议

MATLAB.double类型的变量,可通过numpy.asarray方式转为array类型的变量,方便在Python中处理。

MATLAB中的函数返回到Python中的值默认为1个,需要在函数中增加一个参数nargout=n,如果n与返回的个数不一致,Python会报错。

总结

官方介绍的matlab.engine更好用。

MATLAB负责处理矩阵计算,Python用以解决hash查找的数据结构。

目前还在开发初期阶段,并不知道数据在Python和MATLAB之间的通信效率高不高。

第一次写总结,主要是为了给自己总结用,避免以后发生同样的错误。考虑到网络上相关问题的中文介绍非常少,能找到的都是抄过来抄过去的基础配置问题,我这里分享出来,以期能够帮助到其他朋友。

补充:python调用matlab问题解决小建议

软件及python位数要一致

cmd进行build和install时需要管理员权限运行

多个版本的情况下,需要使用python、python2、python3进行python2 setpy.py build这样

函数的参数一般需要matlab.double转换或者参数赋值时直接改为double型


import matlab.engine
eng = matlab.engine.start_matlab()

需要保证你的函数或脚本就在当前的工作路径下,也就是说要把m文件放到python程序中去


matlab.double([44100])
matlab.double([[1.0,1.4142135623730951,1.7320508075688772,2.0,2.23606797749979]])
signal = eng.hanshu(matlab.double([44100]), matlab.double([3000]), matlab.double([5]))

默认情况下,API认为接收函数返回结果的参数有1个。

这会导致没有返回值的函数在被调用时报错:“Too many output arguments”或是多个返回值的情况下只返回并得到第一个返回值

我们可以人为指定输出参数为0个来避免这样的错误。


eng.hanshu(canshu, nargout=2)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。如有错误或未考虑完全的地方,望不吝赐教。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表