[python][matlab]使用python调用matlab程序
问题引入
在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需要使用matlab进行聚类规划。之前的做法是用python脚本耦合其联系,两者通信的方式是通过文件。后来发现matlab有针对于python的api引擎,瞬间感觉打开了新世界的大门,只需要在python中调用相关的api,就可以完成matlab的工作,再也不用一个一个复制文件了。
解决思路
首先,我安装的是matlab R2015b,对应的python版本为3.4,本来一开始的版本是python36,但是由于matlab2015并不兼容py36,解决方法是,一方面可以通过重新安装高版本的matlab来解决,在高版本的matlab中已经使用了py36的接口。另一方面可以通过修改python版本来实现,通过anconda,可以很简便地安装一个新的py版本,具体的使用情况可以查看conda的帮助文档。
1. 安装matlab engine的py package
在matlab的官方帮助文档里:https://ww2.mathworks.cn/help/matlab/matlab_external/install-the-matlab-engine-for-python.html,可以找到
1 2 | cd "matlabroot/extern/engines/python" python setup.py install |
即切换到对应matlab的engines目录,然后运行安转脚本。需要注意的是,在安装之前需要切换py版本到3.4,否则默认是base的python,那样会出现错误。
2. 在py脚本里调用matlab engine
在matlab 文档 里https://ww2.mathworks.cn/help/matlab/matlab_external/get-started-with-matlab-engine-for-python.html,声明了对应的matlab engine的启动和使用,其中包含了matlab数据和python数据类型的对应关系。
在文档https://ww2.mathworks.cn/help/matlab/matlab_external/call-matlab-functions-from-python.html里,可以更详细地看到如何使用matlab engine:
1 2 3 4 | import matlab.engine eng = matlab.engine.start_matlab() tf = eng.isprime( 37 ) print (tf) #True |
上述的例子是调用了matlab'的判断素数的接口,首先需要在py文件里导入对应的matlab engine包,然后调用start_matlab()来启动引擎,然后使用引擎来得到返回值,需要注意的是,eng下的函数调用不会有提示,需要参照matlab的接口。
上述的是有返回值的调用,当函数具有多个返回值时,那么对应的调用方式如下:
1 2 3 4 | import matlab.engine eng = matlab.engine.start_matlab() t = eng.gcd( 100.0 , 80.0 ,nargout = 3 ) print (t) |
注意当使用具有多个返回值函数的时候,会返回一个python cell,对于含有矩阵的数据,会转换成python的list数据。
当函数没有返回值时,需要使用以下的方式调用:
1 2 3 | import matlab.engine eng = matlab.engine.start_matlab() eng.doc(nargout = 0 ) |
即要声明nargout=0,此时函数不会返回任何参数,如果不声明,就会报错。
3. 在python脚本里调用matlab脚本
该文档的帮助信息在https://ww2.mathworks.cn/help/matlab/matlab_external/call-user-script-and-function-from-python.html,可以看到有两种方式的调用1.直接调用2.调用函数
如果是直接的脚本,比如在triarea.m里写下以下内容:
1 2 3 | b = 5; h = 3; a = 0.5*(b.* h) |
那么在python里就可以直接调用:
1 2 3 | import matlab.engine eng = matlab.engine.start_matlab() eng.triarea(nargout = 0 ) |
就会得到py的打印输出,a=7.5000,这是因为虽然无返回值,但是matlab的输出仍然会显示在py里。当然更方便的方法是调用函数的形式,生成以下的文件:
1 2 | function a = triarea(b,h) a = 0.5*(b.* h); |
在python中执行以下的调用:
1 2 | ret = eng.triarea( 1.0 , 5.0 ) print (ret) |
就会得到2.5,需要注意的是,该函数仅返回一个值,因此无需指定nargout的值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix