【交互】如何从Python中调用Matlab?

本文详细介绍了如何在Python环境中启动和停止MATLAB引擎,以及如何从Python调用MATLAB的函数和脚本。通过示例展示了调用单个和多个输出参数、使用MATLAB运算符的等效函数,以及异步调用的方法。同时,还提供了在Python中处理MATLAB数组的技巧,并给出了一个从Python对MATLAB数据进行分类和绘图的应用案例。
摘要由CSDN通过智能技术生成

将 Python 与 MATLAB 结合使用- MATLAB & Simulink- MathWorks 中国

MATLAB 产品(按版本)兼容的 Python 版本

Python中调用MATLAB - 知乎

Matlab或可以与其他编程语言实现双向集成,外部语言和库的接口包括python\Java\C\C++\Web服务等。本文简述如何从Python中调用Matlab。

 注意:通过本文方法调用时,需要matlab数据转换,参阅MATLAB 数组作为 Python 变量- MATLAB & Simulink- MathWorks 中国

目录

1.验证电脑配置

2.安装引擎API

3.启动和停止MATLAB引擎

4.demon测试

5.附加tips


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)

根据具体情况,选择以下安装方式之一即可:

运行终端窗口命令(以管理员身份运行)
Windowscd "matlabroot\extern\engines\python"
python setup.py install
Mac或Linuxcd "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 中国

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值