在MATLAB和Python之间建个接口,从Python中调用MATLAB脚本或者是MATLAB的函数。内容不是很难,毕竟现成的接口已经有了,在这儿记录一下API使用的一些事项。

注:本篇使用的是MATLAB R2017a,windows 10系统。

相关链接

https://www.mathworks.com/help/matlab/matlab-engine-for-python.html
https://www.mathworks.com/help/matlab/matlab_external/get-started-with-matlab-engine-for-python.html

API的安装

MATLAB在安装的过程中已经准备好了相关文档。根据教程,首先要找到root\R2017a\extern\engines\python文件夹。这里的root指的是MATLAB安装的根目录。对于笔者的电脑,我的全路径就是C:\Program Files\MATLAB\R2017a\extern\engines\python。打开这个文件夹,可以看见下面这几个文件。

其中setup.py是我们想要用的文件。定位到它之后,我们在command window里面转到这个文件夹,然后执行安装。(启动command window的时候必须是管理员模式,否则可能会报“没有权限”的错误

cd C:\Program Files\MATLAB\R2017a\extern\engines\python
python setup.py install
 


不出差错的话,到这里安装过程就结束了。如果你使用的是Python的虚拟环境,那么记得在安装前先将虚拟环境启动。

基本调用

这个API调用非常简单。在Python中,导入如下两个module就能实现MATLAB的全部控制:

import matlab
import matlab.engine

其中,matlab包含的是一些数据形式,比如int8,int16之类。matlab.engine负责程序的启动。

engine = matlab.engine.start_matlab() # Start MATLAB process
engine = matlab.engine.start_matlab("-desktop") # Start MATLAB process with graphic UI

上面两行代码,第一行指示MATLAB在后端运行;第二行则会启动MATLAB的图形界面窗口。调用任何MATLAB函数都通过engine变量来实现。笔者自己调用了一些声音工具箱中的函数,一点问题都没有。

>>> engine.sqrt(2.)
1.4142135623730951

变量兼容性

笔者自己尝试的时候遇到很多变量类型不正确这样的提示,因为MATLAB函数对于输入数据的类型有着比较严格的要求,比如log2对于int8类型输入就会报错。double类型是MATLAB里面用得最多的数据型,所以一般可以将python的数据转成MATLAB兼容的double类型来解决问题。举个例子,Python的list类型变量只需加上matlab.double就可以完成转换。

>>> engine.sqrt([1.,2.,3.,4.,5.])
# Some error
>>> engine.sqrt(matlab.double([1.,2.,3.,4.,5.]))
matlab.double([[1.0,1.4142135623730951,1.7320508075688772,2.0,2.23606797749979]])

调用MATLAB脚本及自定义函数

调用脚本和自定义函数的过程也几乎一样,也是从变量engine中去调用。值得注意的是,需要保证你的函数或脚本就在当前的工作路径下,否则engine会找不到文件而报错。

比方说,笔者当前的工作路径下有两个文件:gaussian_pulse.mpy_matlab.py

gaussian_pulse.m中的内容是这样的:

function out = gaussian_pulse(fs, fc, repeat)
N = 882;
t = 0:1/fs:(N-1)/fs;
yi = gauspuls(t,fc,1/8);
temp = yi;
for i = 1:repeat-1
temp = cat(2, temp,yi);
end
out = temp;
end

py_matlab.py中,我定义了engine并调用这个函数:

engine = matlab.engine.start_matlab()
signal = engine.gaussian_pulse(matlab.double([44100]), matlab.double([3000]), matlab.double([5]))
 

注意到每一个输入参数我都强制性进行了转换确保万无一失。加上方括号也是因为MATLAB的格式需求。

指定输出个数

默认情况下,API认为接收函数返回结果的参数有1个。这会导致没有返回值的函数在被调用时报错:“Too many output arguments”或是其他类似的信息。我们可以人为指定输出参数为0个来避免这样的错误。

>>> playblocking(player) # playblocking is a MATLAB function with no returns
Error using playblocking
Too many output arguments
>>> playblocking(player, nargout=0)
# Success!
 

True 与 False

在MATLAB里面逻辑值是true与false,但是在Python里面它们是大写的True和False。毕竟我们还是在Python环境下编程,所以如果调用某个函数需要用到逻辑值,遵循Python的书写格式。

后记

官方文档里还有一些其他非常好的教程,包括标准输出/错误信息重导向、句柄的使用、画图等等。鉴于笔者时间原因这些没有涉及到,有需要的朋友可以从笔者在开篇提供的网站中找到答案。

python调用matlab脚本的更多相关文章

  1. [python][matlab]使用python调用matlab程序

    问题引入 在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需要使用matlab进行聚类规划 ...

  2. Python 调用 Shell脚本的方法

    Python 调用 Shell脚本的方法 1.os模块的popen方法 通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出. > ...

  3. Linux解决Python调用Matlab函数无法导入matlab.engine问题及其他注意事项

    问题描述 Linux系统,根据matlab官方文档说明,利用Matlab中的API来实现Python调用Matlab函数.具体方法见文档: https://ww2.mathworks.cn/help/ ...

  4. python调用shell脚本时需要切换目录

    最近遇到了一个问题,就是python代码调用shell脚本时,发现输入输出的文件,总是和自己预想的有偏差,但是单独在linux下执行命令的时候,却没有错误.后来发现是相对路径的问题,因为执行pytho ...

  5. python调用matlab

    官网链接: https://ww2.mathworks.cn/help/matlab/matlab_external/call-user-script-and-function-from-python ...

  6. Python的扩展接口[3] -> Matlab引擎 -> 使用 Python 调用 Matlab 程序

    Python - Matlab 目录 Python-Matlab 引擎 Python-Matlab 数组 Python-Matlab 基本操作 Python-Matlab 调用 m 文件 Matlab ...

  7. Windows中使用 Python 调用 Matlab 程序

    https://ww2.mathworks.cn/help/matlab/matlab_external/system-and-configuration-requirements.html http ...

  8. python调用其他脚本

    1.用python调用python脚本 #!/usr/local/bin/python3. import time import os count = str = ('python b.py') re ...

  9. 3种python调用其他脚本的方法,你还知道其他的方法吗?

    1.用python调用python脚本 #!/usr/local/bin/python3.7 import time import os count = 0 str = ('python b.py') ...

随机推荐

  1. hibernate映射-继承映射

    对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate的继承映射可以理解成持久化类之间的继承关系.例如:人和学生之间的关系.学生继承人,可以认为学生是一个特殊的人,如果对人进 ...

  2. Excel特殊符号的录入与录入的秘诀

    软键盘就是输入法上的软键盘 右键单击软键盘 右键! 通过code函数得到符号的数字 按住alt键然后输入数字才可以得到符号 注意是在数字键盘  右边数字键盘区域 插入特殊符号 跳转方向的设置 如果超过 ...

  3. 16.MindManager整理交互思路

    点住主题同时按ins键可以插入一个支节点 右键主题选择下方的排列图表 可以选择排列方式 按住主题同时ctr+v就会粘帖成一个子主题 文本也可以复制黏贴 主题内容可以直接选择拖动更改结构 选择主题框上的 ...

  4. 0006 列表(ul、ol、dl)

    1. 列表标签(重点) 学习目标 理解 无序列表的应用场景 自定义列表的应用场景 应用 无序列表语法 自定义列表语法 问? 前面我们知道表格一般用于数据展示的,但是网页中还是有很多跟表格类似的布局,如 ...

  5. spring定时器时间设置规则

    单纯针对时间的设置规则org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运行时间,只需要设置其cronExpressio ...

  6. 洛谷$P$2575 高手过招 博弈论

    正解:博弈论 解题报告: 传送门! 阿西$gql$又双叒被题意杀辣,,,再不好好学语文吃枣药丸$TT$ 然后在$get$规则之后还有什么问题嘛,,, 就和这题差不多了,一个$easy$的阶梯问题罢辽, ...

  7. $Noip2016/Luogu2822$ 组合数问题

    $Luogu$ 看这题题解的时候看到一个好可爱的表情(●'◡'●)ノ♥ $Sol$ 首先注意到这题的模数是$k$.然而$k$并不一定是质数,所以不能用$C_n^m=\frac{n!}{m!(n-m)! ...

  8. win10开启我的第一个32位汇编程序

    遥想当年,上学期间,汇编程序,从未成功.今又试之,终成功,遂记录. Hello.asm文件如下: . .model flat,stdcall option casemap:none include w ...

  9. 10道java经典算法题,每一题都能帮你提升java水平!

    JAVA经典算法题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:   ...

  10. shell脚本一键配置本地yum源

    效果如图: #!/bin/bash #Author:GaoHongYu #QQ: #Time:-- :: #Name:yumgz.sh #Version:V1. CKGZ=$( df -Th | gr ...