[python][matlab]使用python调用matlab程序
问题引入
在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需要使用matlab进行聚类规划。之前的做法是用python脚本耦合其联系,两者通信的方式是通过文件。后来发现matlab有针对于python的api引擎,瞬间感觉打开了新世界的大门,只需要在python中调用相关的api,就可以完成matlab的工作,再也不用一个一个复制文件了。
解决思路
首先,我安装的是matlab R2015b,对应的python版本为3.4,本来一开始的版本是python36,但是由于matlab2015并不兼容py36,解决方法是,一方面可以通过重新安装高版本的matlab来解决,在高版本的matlab中已经使用了py36的接口。另一方面可以通过修改python版本来实现,通过anconda,可以很简便地安装一个新的py版本,具体的使用情况可以查看conda的帮助文档。
1. 安装matlab engine的py package
在matlab的官方帮助文档里:https://ww2.mathworks.cn/help/matlab/matlab_external/install-the-matlab-engine-for-python.html,可以找到
cd "matlabroot/extern/engines/python"
python setup.py install
即切换到对应matlab的engines目录,然后运行安转脚本。需要注意的是,在安装之前需要切换py版本到3.4,否则默认是base的python,那样会出现错误。
2. 在py脚本里调用matlab engine
在matlab 文档 里https://ww2.mathworks.cn/help/matlab/matlab_external/get-started-with-matlab-engine-for-python.html,声明了对应的matlab engine的启动和使用,其中包含了matlab数据和python数据类型的对应关系。
在文档https://ww2.mathworks.cn/help/matlab/matlab_external/call-matlab-functions-from-python.html里,可以更详细地看到如何使用matlab engine:
import matlab.engine
eng = matlab.engine.start_matlab()
tf = eng.isprime(37)
print(tf) #True
上述的例子是调用了matlab'的判断素数的接口,首先需要在py文件里导入对应的matlab engine包,然后调用start_matlab()来启动引擎,然后使用引擎来得到返回值,需要注意的是,eng下的函数调用不会有提示,需要参照matlab的接口。
上述的是有返回值的调用,当函数具有多个返回值时,那么对应的调用方式如下:
import matlab.engine
eng = matlab.engine.start_matlab()
t = eng.gcd(100.0,80.0,nargout=3)
print(t)
注意当使用具有多个返回值函数的时候,会返回一个python cell,对于含有矩阵的数据,会转换成python的list数据。
当函数没有返回值时,需要使用以下的方式调用:
import matlab.engine
eng = matlab.engine.start_matlab()
eng.doc(nargout=0)
即要声明nargout=0,此时函数不会返回任何参数,如果不声明,就会报错。
3. 在python脚本里调用matlab脚本
该文档的帮助信息在https://ww2.mathworks.cn/help/matlab/matlab_external/call-user-script-and-function-from-python.html,可以看到有两种方式的调用1.直接调用2.调用函数
如果是直接的脚本,比如在triarea.m里写下以下内容:
b = 5;
h = 3;
a = 0.5*(b.* h)
那么在python里就可以直接调用:
import matlab.engine
eng = matlab.engine.start_matlab()
eng.triarea(nargout=0)
就会得到py的打印输出,a=7.5000,这是因为虽然无返回值,但是matlab的输出仍然会显示在py里。当然更方便的方法是调用函数的形式,生成以下的文件:
function a = triarea(b,h)
a = 0.5*(b.* h);
在python中执行以下的调用:
ret = eng.triarea(1.0,5.0)
print(ret)
就会得到2.5,需要注意的是,该函数仅返回一个值,因此无需指定nargout的值。
[python][matlab]使用python调用matlab程序的更多相关文章
- vs2010 matlab混合编程调用matlab引擎
// matlab_engine.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "engine.h" ...
- 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中调用Matlab
检查您的系统是否具有受支持的 Python 版本和 MATLAB R2014b 或更新版本.要检查您的系统上是否已安装 Python,请在操作系统提示符下运行 Python. 1)打开Prompt,输 ...
- Linux解决Python调用Matlab函数无法导入matlab.engine问题及其他注意事项
问题描述 Linux系统,根据matlab官方文档说明,利用Matlab中的API来实现Python调用Matlab函数.具体方法见文档: https://ww2.mathworks.cn/help/ ...
- python调用matlab脚本
在MATLAB和Python之间建个接口,从Python中调用MATLAB脚本或者是MATLAB的函数.内容不是很难,毕竟现成的接口已经有了,在这儿记录一下API使用的一些事项. 注:本篇使用的是MA ...
- python调用matlab
官网链接: https://ww2.mathworks.cn/help/matlab/matlab_external/call-user-script-and-function-from-python ...
- [Python-MATLAB] 在Python中调用MATLAB的API
可以参考官方的说明文档: http://cn.mathworks.com/help/matlab/matlab_external/get-started-with-matlab-engine-for- ...
- 【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)
八皇后问题是一道经典的回溯问题.问题描述如下:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉? 看到这个问题,最容易想 ...
随机推荐
- 在SpringBoot项目中添加logback的MDC
在SpringBoot项目中添加logback的MDC 先看下MDC是什么 Mapped Diagnostic Context,用于打LOG时跟踪一个“会话“.一个”事务“.举例,有一个web ...
- [ZJOI2019]线段树(线段树)
看到这题,首先想到将求和转期望,即每次操作进行概率为1/2,求节点打标记概率. 首先对于每次区间修改操作,对节点进行分类: 1.这个点和其父亲都和修改区间无交,这种情况可以无视. 2.这个点和修改区间 ...
- appache 在windows 中无法启动的测试
使用phpstudy刚启动就自动停止,排除端口被占用后,总感觉找不到好的调试方法 网上找了一些资料,这个方法不错,所以就记录了下来.最好的办法是找appache的bin目录,打开运行,输入httpd. ...
- 深入了解SQL的四种连接&不然要命的!
1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...
- NFV-Based Scalable Guaranteed-Bandwidth Multicast Service for Software Defined ISP Networks
文章名称:NFV-Based Scalable Guaranteed-Bandwidth Multicast Service for Software Defined ISP Networks 发表时 ...
- slickedit编译调试linux应用程序
目录 slickedit编译调试linux应用程序 工程建立 编译 智能报错跳转 配置编译环境 调试 title: slickedit编译调试linux应用程序 date: 2019/3/19 17: ...
- IPv4 forwarding is disabled. Networking will not work_问题解决
构建Docker镜像时遇见的问题,特做以下记录: 1.编辑 vi /etc/sysctl.conf 2.添加 net.ipv4.ip_forward=1 3.重启network服务 systemctl ...
- [面试]死锁-最简单的死锁demo
死锁 什么是死锁 (百度百科) 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁 ...
- 发送邮件,出现异常:服务器响应为: Error: need EHLO and AUTH first !"
在使用 System.Net.Mail组建发送邮件的时候出现了"命令顺序不正确. 服务器响应为: Error: need EHLO and AUTH first !"异常 解决方法 ...
- Jupyter Notebook中的快捷键
1.快捷键 Jupyter Notebook 有两种键盘输入模式.编辑模式,允许你往单元中键入代码或文本:这时的单元框线是绿色的.命令模式,键盘输入运行程序命令:这时的单元框线是灰色. 命令模式 (按 ...