在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. 使用condition 实现线程顺序执行

    书上给的例子都是ABCABC这种,比较简单,复杂点的如A0B0C0, A0A1A2没有,手动实现下,做个记录 1. A0 A1 A2 A3 public class Demo0 { private s ...

  2. 【k8s】kubeadm快速部署Kubernetes

    1.Kubernetes 架构图 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Mast ...

  3. Channel 9视频整理【4】

    Eric ShangKuan 目前服務於台灣微軟,擔任技術傳教士 (Technical Evangelist) 一職,網路上常用的 ID 為 ericsk,對於各項開發技術如:Web.Mobile.A ...

  4. Linux基础:认识Linux

    1.Linux操作系统的特点 优点 ​ (1)可靠性高:linux是基于Unix的概念开发出来的系统,拥有Unix的稳定且效率的特点.运行一年以上而不曾宕机.不必关机是很平常的事情 : ​ (2)彻底 ...

  5. Java 8 默认接口实现及其他语言特性

    一.为什么有默认接口实现 1.由于Java 8的API在现存的接口上引入了非常多的新方法(如List接口上的sort方法).在原有语法基础上,如Guava和Apache Commons这样的框架都需要 ...

  6. flask修改数据库字段的类型和长度

    flask修改数据库字段的类型和长度 ​ 在将models中的字段的db.String(256)修改为db.String(1024)后,执行migrate和upgrade操作后,发现数据库并没有更新, ...

  7. $Poj1723/AcWing123\ Soldiers$ 排序

    $Poj$ $AcWing$ $Description$ $Sol$ 分别处理$x$坐标和$y$坐标.$y$坐标显然很好处理,就是排个序然后取中位数就好了.$x$没有$y$那么直接叭.所以我首先写了个 ...

  8. swoole通往大神之路——swoole任务中心说明及进程任务架构搭建

    Swoole多任务处理中心 如果你还不会用swoole就out了,swoole通往大神之路——swoole任务中心说明及进程任务架构搭建 教学视频: www.bilibili.com/video/av ...

  9. 一起来立Flag吧!超炫的数据图表分析 2020 年 Java 技术趋势

    引言 2020 来了,第一批 00 后已经 20 岁了,95 后也到了晚婚的年龄,员外的头发也越来越少了,新的一年大家有立下了哪些 Flag ?小伙伴们别急着立 Flag,让员外帮你分析一下哪些技术正 ...

  10. window bat批处理 实用脚本

    一行一行读取txt里的内容 @echo off for /f %%i in (C:\Users\86132\Desktop\name.txt) do ( echo %%i>>name2.t ...