在MATLAB和Python之间建个接口,从Python中调用MATLAB脚本或者是MATLAB的函数。内容不是很难,毕竟现成的接口已经有了,在这儿记录一下API使用的一些事项。html
注:本篇使用的是MATLAB R2017a,windows 10系统。java
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.htmlpython
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的虚拟环境,那么记得在安装前先将虚拟环境启动。windows
这个API调用很是简单。在Python中,导入以下两个module就能实现MATLAB的所有控制:后端
import matlab import matlab.engine
其中,matlab包含的是一些数据形式,好比int8,int16之类。matlab.engine负责程序的启动。markdown
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]])
调用脚本和自定义函数的过程也几乎同样,也是从变量engine中去调用。值得注意的是,须要保证你的函数或脚本就在当前的工做路径下,不然engine会找不到文件而报错。网站
比方说,笔者当前的工做路径下有两个文件:gaussian_pulse.m和py_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!
在MATLAB里面逻辑值是true与false,可是在Python里面它们是大写的True和False。毕竟咱们仍是在Python环境下编程,因此若是调用某个函数须要用到逻辑值,遵循Python的书写格式。
官方文档里还有一些其余很是好的教程,包括标准输出/错误信息重导向、句柄的使用、画图等等。鉴于笔者时间缘由这些没有涉及到,有须要的朋友能够从笔者在开篇提供的网站中找到答案。