Python调用MATLAB常见问题与mlab、engine对比
本文详细解析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)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。如有错误或未考虑完全的地方,望不吝赐教。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









