将 Python 与 MATLAB 结合使用- MATLAB & Simulink- MathWorks 中国
Matlab或可以与其他编程语言实现双向集成,外部语言和库的接口包括python\Java\C\C++\Web服务等。本文简述如何从Python中调用Matlab。
注意:通过本文方法调用时,需要matlab数据转换,参阅MATLAB 数组作为 Python 变量- MATLAB & Simulink- MathWorks 中国
目录
1.验证电脑配置
默认电脑已安装MATLAB(version:R2019b)和Python(version:3.6/3.7),且两者兼容,参阅 MATLAB 产品(按版本)兼容的 Python 版本。
MATLAB命令行窗口输入:matlabroot,返回MATLAB文件夹的路径D:\matlab_R2019b。
2.安装引擎API
已安装的MATLAB都自带setup.py文件(D:\matlab_R2019b\extern\engines\python\setup.py)
根据具体情况,选择以下安装方式之一即可:
运行终端窗口 | 命令(以管理员身份运行) |
Windows | cd "matlabroot\extern\engines\python" python setup.py install |
Mac或Linux | cd "matlabroot/extern/engines/python" python setup.py install |
Matlab命令窗口 | cd (fullfile(matlabroot,'extern','engines','python')) system('python setup.py install') |
3.启动和停止MATLAB引擎
在Python环境下启动和停止MATLAB引擎,命令:
import matlab # matlab用于数据转换等工作
import matlab.engine # engine启动调用的matlab函数
eng = matlab.engine.start_matlab() # 启动
eng.quit() # 停止 或eng.exit()
这样就可以在Python中调用MATLAB环境下的函数或类或.m文件脚本了!
4.demon测试
demon 1: 调用函数
直接调用MATLAB函数并将结果返回到Python,默认情况下返回单个输出参数(case1)。
若需要返回多个参数,使用nargout指定数量(case2)。
若不需要返回任何参数,需将nargout设为0(case3)。
在Python中,不能直接使用MATLAB的运算符(+ / - *...),需用等效的函数替代(case4),参阅MATLAB 运算符和关联的函数。
import matlab.engine
eng = matlab.engine.start_matlab()
# case 1:返回单个参数
b = 9.0
t1 = eng.sqrt(b[0])
print(t1) # 输出:3.0
# case 2:返回多个参数
t2 = eng.gcd(100.0,80.0,nargout=3)
print(t2) # 输出:(20.0, 1.0, -1.0)
# case 3:不返回参数
eng.doc(nargout=0) # 将直接打开浏览器MATLAB文档界面
# case 4:用函数名替代MATLAB运算符
a=2
b=3
t4 = eng.plus(a,b)
print(t4) # 输出:5
eng.quit()
demon 2: 调用用户脚本和函数
# python调用用户脚本t1.m
# 指定 nargout=0。尽管脚本会打印输出,但它不会向 Python 返回任何输出参数。
import matlab.engine
eng = matlab.engine.start_matlab()
eng.t1(nargout=0) # 输出:result=5
eng.quit()
---------------分割线-------------------
% matlab t1.m文件中创建脚本
a = 2;
b = 3;
result = a + b
# python中调用用户函数t2.m
import matlab
import matlab.engine
eng = matlab.engine.start_matlab()
result = eng.t2(1, 2)
print(result) # 3
print(type(result)) # <class 'int'>
eng.quit()
---------------分割线-------------------
% matlab 将t1.m文件中的脚本转换为函数:t2.m
function result = t2(a, b)
result = a + b;
end
5.附加tips
tips 1: 在Python中使用MATLAB数组
在Python中创建MATLAB数组,引擎支持将该数组作为参数传入MATLAB函数,数组也可作为输出返回给Python。
# 引擎传输list或tuple数组给MATLAB函数,返回matlab.double数组给Python
import matlab.engine
eng = matlab.engine.start_matlab()
# 一维数组
a = matlab.double([9,16]) # list或 a = matlab.double((9,16)) tuple
t1 = eng.sqrt(a)
print(t1) # 输出:[[3.0,4.0]] 1X2的matlab.double数组
print(t1.size) # 输出:(1,2)
# 多维数组
a = matlab.double([[1,2,3,4],[5.0,6.0,7.0,8.0]])
print(a) # 输出:[[1.0,2.0,3.0,4.0],[5.0,6.0,7.0,8.0]]
print(a.size) #属性 输出:(2,4)
print(a[0][1]) #索引 输出:2.0
print(a[0][1:3]) #切片 输出:[2.0,3.0]
print(a.reshape((4,2))) #重构 输出:[[1.0,3.0],[5.0,7.0],[2.0,4.0],[6.0,8.0]]
b = eng.magic(3)
print(b.size) # 输出:(3,3)
for x in b: print(x)
...
#输出:for循环分行打印数组中的每行
[8.0,1.0,6.0]
[3.0,5.0,7.0]
[4.0,9.0,2.0]
tips 2: 从Python以异步方式调用MATLAB函数
默认情况下,引擎同步调用MATLAB函数,即仅当MATLAB函数执行完毕,控制权才会返还给Python。
引擎也支持异步调用函数,即当MATLAB仍在执行函数时,控制权会立即返还给Python。引擎将结果存储在Python变量中。具体如下:
使用background参数异步调用MATLAB函数;
使用done方法查看异步调用是否完成;
使用cancel方法提前停止函数执行
import matlab.engine
eng = matlab.engine.start_matlab()
# 使用background参数实现异步调用
future = eng.sqrt(9.0, background=True)
ret = future.result()
print(ret) # 输出: 3.0
# 使用done方法查看异步调用是否完成
tf = future.done()
print(tf) # 输出:Ture
# 使用cancel方法提前停止函数执行
print(future.cancel()) # 输出:False
tips 3: 从Python对MATLAB数据进行分类并绘图
此示例说明如何在 Python® 中将患者数据分类到吸烟者和非吸烟者列表中,并对 MATLAB® 患者的血压读数绘图。
参阅从 Python 对 MATLAB 数据进行分类并绘图- MATLAB & Simulink- MathWorks 中国