python调用matlab脚本

在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

API的安装

MATLAB在安装的过程当中已经准备好了相关文档。根据教程,首先要找到root\R2017a\extern\engines\python文件夹。这里的root指的是MATLAB安装的根目录。对于笔者的电脑,个人全路径就是C:\Program Files\MATLAB\R2017a\extern\engines\python。打开这个文件夹,能够看见下面这几个文件。
1
其中setup.py是咱们想要用的文件。定位到它以后,咱们在command window里面转到这个文件夹,而后执行安装。(启动command window的时候必须是管理员模式,不然可能会报“没有权限”的错误编程

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

2
不出差错的话,到这里安装过程就结束了。若是你使用的是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]])

调用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的书写格式。

后记

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

相关文章
相关标签/搜索