python调用matlab脚本
在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.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!
True 与 False
在MATLAB里面逻辑值是true与false,但是在Python里面它们是大写的True和False。毕竟我们还是在Python环境下编程,所以如果调用某个函数需要用到逻辑值,遵循Python的书写格式。
后记
官方文档里还有一些其他非常好的教程,包括标准输出/错误信息重导向、句柄的使用、画图等等。鉴于笔者时间原因这些没有涉及到,有需要的朋友可以从笔者在开篇提供的网站中找到答案。
python调用matlab脚本的更多相关文章
- [python][matlab]使用python调用matlab程序
问题引入 在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需要使用matlab进行聚类规划 ...
- Python 调用 Shell脚本的方法
Python 调用 Shell脚本的方法 1.os模块的popen方法 通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出. > ...
- Linux解决Python调用Matlab函数无法导入matlab.engine问题及其他注意事项
问题描述 Linux系统,根据matlab官方文档说明,利用Matlab中的API来实现Python调用Matlab函数.具体方法见文档: https://ww2.mathworks.cn/help/ ...
- python调用shell脚本时需要切换目录
最近遇到了一个问题,就是python代码调用shell脚本时,发现输入输出的文件,总是和自己预想的有偏差,但是单独在linux下执行命令的时候,却没有错误.后来发现是相对路径的问题,因为执行pytho ...
- python调用matlab
官网链接: https://ww2.mathworks.cn/help/matlab/matlab_external/call-user-script-and-function-from-python ...
- Python的扩展接口[3] -> Matlab引擎 -> 使用 Python 调用 Matlab 程序
Python - Matlab 目录 Python-Matlab 引擎 Python-Matlab 数组 Python-Matlab 基本操作 Python-Matlab 调用 m 文件 Matlab ...
- Windows中使用 Python 调用 Matlab 程序
https://ww2.mathworks.cn/help/matlab/matlab_external/system-and-configuration-requirements.html http ...
- python调用其他脚本
1.用python调用python脚本 #!/usr/local/bin/python3. import time import os count = str = ('python b.py') re ...
- 3种python调用其他脚本的方法,你还知道其他的方法吗?
1.用python调用python脚本 #!/usr/local/bin/python3.7 import time import os count = 0 str = ('python b.py') ...
随机推荐
- Linux基础:认识Linux
1.Linux操作系统的特点 优点 (1)可靠性高:linux是基于Unix的概念开发出来的系统,拥有Unix的稳定且效率的特点.运行一年以上而不曾宕机.不必关机是很平常的事情 : (2)彻底 ...
- 经典问题(c++/python)素数、杨辉三角(金字塔型)、统计单词数、简单计算器、密码安全程度、凯撒密码加密、汉诺塔 (python课设实验实例)-- biaobiao88
[编写程序,输人一个大于2的自然数,然后输出小于该数字的所有素数组成的列表.]所谓素数,是指除了1和自身之外没有其他因数的自然数,最小的素数是2,后面依次是3.5.7.11.13... c++代码: ...
- EasyMock.replay()有什么用
现在很多项目都使用EasyMock来作为单元测试框架. EasyMock一个方法,基本上是三步:EasyMock.expect().EasyMock.replay().EasyMock.verify( ...
- MSXM简单的使用
// xml.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <string> #include <at ...
- HDU3652 B-number 题解 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3652 题目大意: 求区间 \([1, n]\) 范围内包含连续的数位"13"并且能 ...
- 1073 多选题常见计分法 (20分)C语言
批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数:如果考生选择了任何一个错误的选项,则不能得分.本 ...
- 1048 数字加密 (20 分)C语言
本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余--这里用 J 代表 ...
- 通过例子学习C++(三)最大公约数,并知其然
本文是通过例子学习C++的第三篇,通过这个例子可以快速入门c++相关的语法. 题目要求:输入两个整数,求其大公约数. 解答方法一:两个数的最大公约数,是这两个数中的小数,或者是这2个数的公约数中的最大 ...
- 《大厂面试》京东+百度一面,不小心都拿了Offer
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和 ...
- Android学习进度一
在解决了电脑产生的一系列问题之后成功安装了Android Studio,并在其自带的手机模拟器上成功运行了第一个App(Hello World!),通过这个最简单的App研究了App基本的工程结构,为 ...