问题引入

在做实验的时候,需要用到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程序的更多相关文章

  1. vs2010 matlab混合编程调用matlab引擎

    // matlab_engine.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "engine.h" ...

  2. Python的扩展接口[3] -> Matlab引擎 -> 使用 Python 调用 Matlab 程序

    Python - Matlab 目录 Python-Matlab 引擎 Python-Matlab 数组 Python-Matlab 基本操作 Python-Matlab 调用 m 文件 Matlab ...

  3. Windows中使用 Python 调用 Matlab 程序

    https://ww2.mathworks.cn/help/matlab/matlab_external/system-and-configuration-requirements.html http ...

  4. 如何在Python中调用Matlab

    检查您的系统是否具有受支持的 Python 版本和 MATLAB R2014b 或更新版本.要检查您的系统上是否已安装 Python,请在操作系统提示符下运行 Python. 1)打开Prompt,输 ...

  5. Linux解决Python调用Matlab函数无法导入matlab.engine问题及其他注意事项

    问题描述 Linux系统,根据matlab官方文档说明,利用Matlab中的API来实现Python调用Matlab函数.具体方法见文档: https://ww2.mathworks.cn/help/ ...

  6. python调用matlab脚本

    在MATLAB和Python之间建个接口,从Python中调用MATLAB脚本或者是MATLAB的函数.内容不是很难,毕竟现成的接口已经有了,在这儿记录一下API使用的一些事项. 注:本篇使用的是MA ...

  7. python调用matlab

    官网链接: https://ww2.mathworks.cn/help/matlab/matlab_external/call-user-script-and-function-from-python ...

  8. [Python-MATLAB] 在Python中调用MATLAB的API

    可以参考官方的说明文档: http://cn.mathworks.com/help/matlab/matlab_external/get-started-with-matlab-engine-for- ...

  9. 【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)

    八皇后问题是一道经典的回溯问题.问题描述如下:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉?         看到这个问题,最容易想 ...

随机推荐

  1. python第九天

    复习内容: 文件处理 1. 操作文件的三步骤: ---打开文件:硬盘的空间被操作系统持有  |  文件对象被应用程序持有 ---操作文件:读写操作 ---释放文件:释放操作系统对硬盘空间的持有 2. ...

  2. plink计算两个SNP位点的连锁不平衡值(LD)

    PLINK提供了“--ld”的参数计算两个SNP位点的连锁不平衡值. 命令如下: plink --file file --ld rs123 rs134 --out rs123_rs134 生成如下数据 ...

  3. SaltStack配置管理和YAML

    配置管理和YAML 配置管理 所谓的配置管理,也称为状态管理,就是可以通过编写文件,文件的内容为安装什么功能.开启什么服务,执行什么任务等信息,然后通过salt的配置管理,指定minion来执行这些操 ...

  4. 实验一 Java开发环境的熟悉(Linux + Idea) 20175301李锦然

    https://gitee.com/ShengHuoZaiDaXue/20175301.git 实验一 Java开发环境的熟悉(Linux + Idea) 实验内容 1.使用JDK编译.运行简单的Ja ...

  5. sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系

    原创链接:https://www.cnblogs.com/lxf1117/p/6762315.html sql server登录名.服务器角色.数据库用户.数据库角色.架构区别联系 1.一个数据库用户 ...

  6. PMP知识点(二)——三点估算的两种方法对活动持续时间估算的影响和如何取舍

    一.准备工作 活动持续时间的估算属于PMBOK中第六章项目时间管理中第五节6.6估算活动持续时间的内容. 三点估算是6.5和7.2(估算成本)中应用到的一种工具和技术.数据流向图参考如下: 其应用到的 ...

  7. Java JPS找不到正在执行的java进程 jps cannot see running java process

    最近磁盘进展,把临时目录/tmp给全删了,结果发现jps的输出为空,找不到正在运行的jvm进程. 但是新建的进程没有问题,能够正常查看: [root@node-master ~]# ps -e|gre ...

  8. “不能在dropdownlist中选择多个项

    DropDownList.ClearSelection(); DropDownList.SelectedItem.Text = "value值";

  9. idea工具的快捷方式

    用idea默认的快捷键 Ctrl+~,快速切换方案(界面外观.代码风格.快捷键映射等菜单) Shift+Enter,向下插入新行 Ctrl+F,查找文本 Ctrl+R,替换文本 Ctrl+I,实现方法 ...

  10. PostgreSQL中JSON、JSONB基本操作符

    PostgreSQL 9.5以上的版本中有了很多方便的操作符,使得操作 JSON 变得非常方便了. 一. -> 和 ->> : -> 表示获取一个JSON数组元素,支持下标值( ...