Python - Matlab


目录

  1. Python-Matlab 引擎
  2. Python-Matlab 数组
  3. Python-Matlab 基本操作
  4. Python-Matlab 调用 m 文件

Matlab的官方文档中介绍了Matlab与其余编程语言之间的引擎接口,其中包括对于Python开放的引擎API,可参考官方教程,其中包括引擎安装,基本使用,以及Python与Matlab之间的数据类型转换及交互。

除了使用官网的Matlab引擎来驱动Matlab外,还可以使用第三方包mlab来进行连接或直接使用win32comdispatch来进行控制,但目前mlab仅支持Python 2的版本。

1 Python-Matlab引擎 / Pyhton-Matlab Engine

首先,需要确保Matlab及Python的配置和安装,利用Matlab提供的setup.py文件安装Python的引擎包,安装步骤及过程如下,

1. 确保安装可用的Python和Matlab,且两者版本对应,如32位的Matlab需对应32位的Python,同时还需查看Matlab支持的Python版本(目前2015a版支持的Python版本为2.7/3.3/3.4);

2. 添加Python目录到环境变量(如果未添加);

3. 获取Matlab文件夹目录,可通过Matlab命令行窗口输入matlabroot命令返回;

4. 安装引擎,Windows利用下面的命令(此处路径可能需要修改)进行安装,此处可能需要管理员权限运行。

  1. cd C:\Program Files\MATLAB\R2015a\extern\engines\python
  2. python setup.py install
  3. pause

2 Python-Matlab数组 / Pyhton-Matlab Array

在Python中,如果需要创建一个Matlab的数组,也可以通过Matlab引擎API来完成,主要数据类型如下图显示。

下面介绍数组的基本使用,其基本使用方法与numpy类似,但是reshape()函数略有不同,

  1. import matlab.engine
  2.  
  3. # Basic usage
  4. int_8 = matlab.int8([1, 2, 3, 4, 5, 6])
  5. print(int_8) # [[1, 2, 3, 4, 5, 6]]
  6. print(int_8.size) # (1, 6)
  7. int_8.reshape((2, 3)) # reshape function is different from numpy
  8. print(int_8) # [[1, 3, 5], [2, 4, 6]]
  9.  
  10. double = matlab.double([[1, 2, 3], [4, 5, 6]])
  11. print(double) # [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]
  12. print(double[0]) # [1.0, 2.0, 3.0]
  13. print(double[1][2]) # 6.0

对于数组的切片,Matlab的array与Python的list也有所不同,官网给出的解释在于,Matlab数组切片返回的是一个视图,而不是像Python中返回一个浅拷贝。

  1. # Slice array
  2. py = [[1, 2, 3], [4, 5, 6]]
  3. mt = matlab.int32([[1, 2, 3], [4, 5, 6]])
  4. py[0] = py[0][::-1]
  5. mt[0] = mt[0][::-1]
  6. # Slicing a Matlab array returns a view instead of a shallow copy
  7. print(py) # [[3, 2, 1], [4, 5, 6]]
  8. print(mt) # [[3, 2, 3], [4, 5, 6]]

3 Python-Matlab基本操作 / Pyhton-Matlab Basic Operation

Python还可以通过引擎完成对Matlab的一些基本操作与控制。

完整代码

  1. import matlab.engine
  2.  
  3. eng = matlab.engine.start_matlab()
  4.  
  5. print(eng.sqrt(4.)) # 2.0
  6. eng.plot(matlab.int32([1, 2, 3, 4]), matlab.int32([1, 2, 3, 4]))
  7.  
  8. eng.eval("hold on", nargout=0)
  9. eng.eval("plot([4, 3, 2, 1], [1, 2, 3, 4])", nargout=0)
  10.  
  11. eng.eval("x = 3", nargout=0)
  12. eng.eval("y = 41", nargout=0)
  13. eng.eval("z = [213, 123]", nargout=0)
  14. print(eng.workspace)
  15. print(eng.workspace['x'], eng.workspace['z'])
  16. """
  17. Name Size Bytes Class Attributes
  18.  
  19. x 1x1 8 double
  20. y 1x1 8 double
  21. z 1x2 16 double
  22.  
  23. 3.0 [[213.0,123.0]]
  24. """
  25.  
  26. input("Press Enter to exit.")
  27. eng.quit()

分段解释

  1. import matlab.engine
  2.  
  3. eng = matlab.engine.start_matlab()

首先导入需要的包并生成实例,此处调用sqrt()函数计算,得到结果,还可以利用引擎实例调用plot函数进行画图,但需要注意的是,传入的参数需要是Matlab类型参数。

  1. print(eng.sqrt(4.)) # 2.0
  2. eng.plot(matlab.int32([1, 2, 3, 4]), matlab.int32([1, 2, 3, 4]))

当我们需要执行某些Matlab命令时,可以利用eval函数对其进行输入,下面的方法画出了另外一条直线,其中nargout参数为设置输出返回参数的数量,默认为1。无参数返回时需要设置为0。

  1. eng.eval("hold on", nargout=0)
  2. eng.eval("plot([4, 3, 2, 1], [1, 2, 3, 4])", nargout=0)
  3.  
  4. eng.eval("x = 3", nargout=0)
  5. eng.eval("y = 41", nargout=0)
  6. eng.eval("z = [213, 123]", nargout=0)
  7. print(eng.workspace)
  8. print(eng.workspace['x'], eng.workspace['z'])
  9. """
  10. Name Size Bytes Class Attributes
  11.  
  12. x 1x1 8 double
  13. y 1x1 8 double
  14. z 1x2 16 double
  15.  
  16. 3.0 [[213.0,123.0]]
  17. """
  18.  
  19. input("Press Enter to exit.")
  20. eng.quit()

4 Python-Matlab调用m文件 / Pyhton-Matlab Call m File

下面介绍如何使用Python调用m来进行计算并获得返回结果,首先定义以下的m文件,在被调用的m文件中再调用下一个m文件,使用的m文件如下,

定义入口函数callentry,接收两个参数,随后对两个参数分别在内部进行加和乘操作,再调用外部另一个m文件的callsub函数进行相减操作,将返回的结果保存在数组r中返回。

callentry.m 代码

  1. function [x, y, z] = callentry(a, b);
  2. x = add(a, b)
  3. y = mul(a, b)
  4. z = callsub(a, b)
  5. end
  6.  
  7. function l = mul(m, n);
  8. l=m*n;
  9. end
  10.  
  11. function l = add(m, n);
  12. l=m+n;
  13. end

callsub.m 代码

  1. function r = callsub(a, b);
  2. r = a-b;
  3. end

在Python中,运行如下代码,

  1. import matlab.engine
  2.  
  3. eng = matlab.engine.start_matlab()
  4. print(eng.callentry(7.7, 2.1, nargout=3))
  5. eng.quit()

Note: 值得注意的是,此处需要设置nargout参数,当未设置时默认为1,即默认只返回1个参数,当知道Matlab返回参数的数量时,通过nargout进行设置来获取所有需要的参数。无参数返回时请设为0

在第一次运行生成实例时会较慢,因为需要启动Matlab引擎,最终得到输出如下,可以看到,Matlab的console界面显示的结果在Python中也会输出,最后得到的结果是列表形式的Python数据。

  1. x =
  2. 9.8000
  3.  
  4. y =
  5. 16.1700
  6.  
  7. z =
  8. 5.6000
  9.  
  10. r =
  11. 9.8000 16.1700 5.6000
  12.  
  13. (9.8, 16.17, 5.6)

Python的扩展接口[3] -> Matlab引擎 -> 使用 Python 调用 Matlab 程序的更多相关文章

  1. Python的扩展接口[1] -> 串口通信

    串口通信 / Serial Communication 1 串口简介 / Serial Introduction 串行接口(Serial Interface)简称串口,通常为COM接口,数据发送方式为 ...

  2. Python的扩展接口[0] -> VISA仪器控制

    VISA仪器控制 / VISA Instrument Control 1 VISA简介 / VISA Introduction VISA(Virtual Instrument Software Arc ...

  3. Python的扩展接口[2] -> 动态链接库DLL[0] -> 动态链接库及辅助工具

    动态链接库 / Dynamic Link Library 目录 动态链接库简介 函数封装DLL 组件对象模型COM 如何判断.dll文件是COM还是DLL 辅助工具 1 动态链接库简介 / DLL I ...

  4. Python的扩展接口[2] -> 动态链接库DLL[1] -> 组件对象模型 COM 的 Python 调用

    组件对象模型 COM 的 Python 调用 关于COM的基本概念,可参考组件对象模型 COM的内容,下面主要介绍两种使用 Python 调用 COM 组件的方法. 1 使用 win32com 1.1 ...

  5. C++调用matlab实例

    这段代码是C++调用matab引擎的过程,代码的目的很简单,在C++中创建一个vector数组,然后将这个vector数组单位化.写这个代码的目的是学些C++与matlab之间的数据交互,以供日后参考 ...

  6. C++调用Matlab函数求特征值

    最近需要用到C++和Matlab的混编,记录一下学习过程~ 要实现的是调用Matlab函数,求矩阵前k个最小的特征值及其特征向量. //C++ #include "engine.h" ...

  7. C++调用matlab函数

    C++与matlab混合编程——C++调用MATLAB函数 笔者最近在从事一个MFC相关的项目,要求将用Matlab实现的算法通过应用MFC制作成一个小应用.其中有一部分内容需要求一个多元函数的最值. ...

  8. 一个可扩展的深度学习框架的Python实现(仿keras接口)

    一个可扩展的深度学习框架的Python实现(仿keras接口) 动机 keras是一种非常优秀的深度学习框架,其具有较好的易用性,可扩展性.keras的接口设计非常优雅,使用起来非常方便.在这里,我将 ...

  9. [python][matlab]使用python调用matlab程序

    问题引入 在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需要使用matlab进行聚类规划 ...

随机推荐

  1. HTML不常用的表单属性-fieldset

    这是代码 这是生成的样子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...

  2. 我的Git之旅(1)---git安装、github注册以及一些基本命令

    蚂蚁作为一个混码农届的新人来说,看到什么东西都觉得高大上的感觉.最近接触到了git,有种蠢蠢欲动的感觉,想 试一把.因此开启了我的Git之旅.废话不多说,开始我的git之旅. 1.git服务器的选择 ...

  3. NOIP模拟赛17

    5分.... T1 LOJ 计算几何瞎暴力 维护以下操作: 1.序列末尾加一个数 2.序列全体从小到大排序 3.查询区间和 4.序列全体异或一个数k 序列全体异或一个数,很明显是trie树 那么序列全 ...

  4. POJ 1228 Grandpa's Estate 凸包 唯一性

    LINK 题意:给出一个点集,问能否够构成一个稳定凸包,即加入新点后仍然不变. 思路:对凸包的唯一性判断,对任意边判断是否存在三点及三点以上共线,如果有边不满足条件则NO,注意使用水平序,这样一来共线 ...

  5. jquery键盘事件全记录

    很多时候,我们需要获取用户的键盘事件,下面就一起来看看jquery是如何操作键盘事件的. 一.首先需要知道的是: 1.keydown() keydown事件会在键盘按下时触发. 2.keyup() k ...

  6. placeholder样式设置

    在input框中有时想将输入的字和placeholder设为不同的颜色或其它效果,这时就可以用以下代码来对placeholder进行样式设置了. ::-webkit-input-placeholder ...

  7. Sublime之快捷键(二)

    1. 在使用Sublime的时候,经常用到选中文件中相同的一些字段,那怎么办呢? 快捷键: ctrl + d 可以快速的选择,你所选中的文字,每次按下该快捷键,就会自动的寻找相同的字段: Alt + ...

  8. WordPress的SEO插件——WordPress SEO by yoast安装及使用

    插件:WordPress SEO by yoast 使用方法: 做好网站SEO一直是站长们的愿望,说简单也简单,但是说难也难,因为需要注意的地方太多,一个不小心被百度K了你都不知道怎么回事.这里和大家 ...

  9. Python中单引号,双引号,三引号

    1.单引号与双引号的区别 s1=‘let‘s go’(明显我们是想用单引号表示let’s go这个字符串的,但是python只知道用‘’来表示字符串,所以python就把字符串中的‘字符当成单引号处理 ...

  10. python 实现字符串转整型

    def str2Int(s): l=list(s) if len(l)<=0: return 0 flag=0 sum=0 dict_num={':9} dict_tag={'+':1,'-': ...