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

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 代码

function [x, y, z] = callentry(a, b);
x = add(a, b)
y = mul(a, b)
z = callsub(a, b)
end

function l = mul(m, n);
l=m*n;
end

function l = add(m, n);
l=m+n;
end

callsub.m 代码

function r = callsub(a, b);
r = a-b;
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数据。

x =
    9.8000  

y =
   16.1700  

z =
    5.6000  

r =
    9.8000   16.1700    5.6000  

(9.8, 16.17, 5.6)  

原文地址:https://www.cnblogs.com/stacklike/p/8279277.html

时间: 2024-12-21 07:27:00

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

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

串口通信 / Serial Communication 1 串口简介 / Serial Introduction 串行接口(Serial Interface)简称串口,通常为COM接口,数据发送方式为一位一位地顺序传送,通信线路简单,一对传输线即可实现双向通信,适用于远距离且传输速度慢的通信.其中最常用的也是标准接口为RS-232,除此之外还有RS-422,RS-485等. 2 pyserial环境搭建 Pyserial的安装可以通过pip进行,直接在命令行输入下列命令进行安装, pip ins

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

VISA仪器控制 / VISA Instrument Control 1 VISA简介 / VISA Introduction VISA(Virtual Instrument Software Architecture,简称为VISA),即虚拟仪器软件结构,是VXI plug&play联盟制定的I/O接口软件标准及其规范的总称.VISA提供用于仪器编程的标准I/O函数库,称为VISA库.VISA函数库驻留在计算机系统内,是计算机与仪器的标准软件通信接口,计算机通过它来控制仪器. 作为通用I/O标

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

动态链接库 / Dynamic Link Library 目录 动态链接库简介 函数封装DLL 组件对象模型COM 如何判断.dll文件是COM还是DLL 辅助工具 1 动态链接库简介 / DLL Introduction 动态链接库(Dynamic Link Library, DLL),是微软在Windows操作系统中,实现共享函数库概念的一种方式,在Windows下,这些库函数的扩展名可以是.dll/.ocx(ActiveX)/.drv(旧式系统驱动程序),在Linux系统中常常是.so文件

C++调用matlab实例

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

VS2013调用MATLAB混合编程

Visual Studio和MATLAB混合编程,有两种方法: 1 MATLAB调用C程序: 2 VS调用MATLAB(目前见到的都是VS,其他编译器如codeblocks,或不提供这项功能): 前一种是用MATLAB的mex命令调用VS或其他编译器,将以一定方式编写出的C文件编译成.mexw32(针对win32)或者.mexw64(针对win64),然后MATLAB就可以用调用动态链接库的方式,调用C程序.这一过程中,只需要在安装好编译器的前提下,执行: mex -setup 和 mbuild

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

最近需要用到C++和Matlab的混编,记录一下学习过程~ 要实现的是调用Matlab函数,求矩阵前k个最小的特征值及其特征向量. //C++ #include "engine.h" //使用Matlab引擎需要包含的头文件#include <iostream>using namespace std;int main(){ Engine *m_engine; //创建Matlab引擎 m_engine = NULL; //初始化引擎 if((!m_engine &&

C++调用matlab函数

C++与matlab混合编程--C++调用MATLAB函数 笔者最近在从事一个MFC相关的项目,要求将用Matlab实现的算法通过应用MFC制作成一个小应用.其中有一部分内容需要求一个多元函数的最值.通过网络,我找到了两个C++优化库,dlib与MIDACO_Project ,可是这两个库中的优化函数的应用方式无法融入MFC编程框架,因此想到应用matlab与C++混合编程来实现相关计算.在网络上查了很多资料使问题得到了解决,下面对之前所查资料的内容做一番总结. 一.编译matlab函数 在ma

VB.NET 调用MATLAB的M文件(生成COM控件)

一.版本说明:VS2008,MATLAB2010b 二.安装MCRInstaller 在路径C:\Program Files\MATLAB\R2010b\toolbox\compiler\deploy\win32下 三.在MATLAB命令窗口中配置环境 1. 输入: mbuild –setup 出现以下界面,我选择的是[2]自己的编译器,不是MATLAB自带的. 2.打开下图 3.然后弹出以下对话框 名字自己命,我的叫recognition.选择Generic COM Component.点击

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

问题引入 在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需要使用matlab进行聚类规划.之前的做法是用python脚本耦合其联系,两者通信的方式是通过文件.后来发现matlab有针对于python的api引擎,瞬间感觉打开了新世界的大门,只需要在python中调用相关的api,就可以完成matlab的工作,再也不用一个一个复制文件了. 解决思路 首先,我安装的是matlab R201