python 与 matlab 混编
用于 Python 的 MATLAB 引擎 API 快速入门
安装用于 Python 的 MATLAB 引擎 API
Matlab的官方文档中介绍了 Matlab 与其余编程语言之间的引擎接口,其中包括对于 Python 开放的引擎 API,可参考官方教程,其中包括引擎安装,基本使用,以及Python与Matlab之间的数据类型转换及交互。
- 在 Windows 系统中:(可能需要管理员权限运行)
cd "matlabroot\extern\engines\python"
python setup.py install
- 在 Mac 或 Linux 系统中:
cd "matlabroot/extern/engines/python"
python setup.py install
基础用法
下面介绍数组的基本使用,其基本使用方法与 numpy 类似,但是 reshape()
函数略有不同,
import matlab
int_8 = matlab.int8([1, 2, 3, 4, 5, 6])
print(int_8) # [[1, 2, 3, 4, 5, 6]]
print(int_8.size) # (1, 6)
int_8.reshape((2, 3)) # reshape function is different from numpy
print(int_8) # [[1, 3, 5], [2, 4, 6]]
double = matlab.double([[1, 2, 3], [4, 5, 6]])
print(double) # [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]
print(double[0]) # [1.0, 2.0, 3.0]
print(double[1][2]) # 6.0
对于数组的切片,Matlab 的 array 与 Python 的 list 也有所不同,官网给出的解释在于,Matlab 数组切片返回的是一个视图,而不是像 Python 中返回一个浅拷贝。
# Slice array
py = [[1, 2, 3], [4, 5, 6]]
mt = matlab.int32([[1, 2, 3], [4, 5, 6]])
py[0] = py[0][::-1]
mt[0] = mt[0][::-1]
# Slicing a Matlab array returns a view instead of a shallow copy
print(py) # [[3, 2, 1], [4, 5, 6]]
print(mt) # [[3, 2, 3], [4, 5, 6]]
Python的扩展接口 中介绍:
Python 还可以通过引擎完成对 Matlab 的一些基本操作与控制。以下代码需要在终端运行:
import matlab.engine
eng = matlab.engine.start_matlab()
print(eng.sqrt(4.)) # 2.0
eng.plot(matlab.int32([1, 2, 3, 4]), matlab.int32([1, 2, 3, 4]))
eng.eval("hold on", nargout=0)
eng.eval("plot([4, 3, 2, 1], [1, 2, 3, 4])", nargout=0)
eng.eval("x = 3", nargout=0)
eng.eval("y = 41", nargout=0)
eng.eval("z = [213, 123]", nargout=0)
print(eng.workspace)
print(eng.workspace['x'], eng.workspace['z'])
"""
Name Size Bytes Class Attributes
x 1x1 8 double
y 1x1 8 double
z 1x2 16 double
3.0 [[213.0,123.0]]
"""
input("Press Enter to exit.")
eng.quit()
Python-Matlab调用(call) 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 中,运行如下代码
import matlab.engine
eng = matlab.engine.start_matlab()
print(eng.callentry(7.7, 2.1, nargout=3))
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)
MATLAB 中 调用 Python
只要正确安装对应的 matlab 和 python,一般就可以使用了(不需要手动设置路径)。
matlab 官方教程:从 MATLAB 调用 Python
matlab 把所有参数输出到一个文件里,然后用 system
命令调 python 脚本。python 脚本读文件做计算结果再写文件。最后 matlab 再读文件得到结果。假设 python 脚本的用法是:
python xxx.py in.txt out.txt
则 matlab 调用的命令:
[status, cmdout] = system('python xxx.py in.txt out.txt')
Matlab 的 system
函数用来向操作系统发送一条指令,并得到控制台的输出,可以直接将控制台的输出在 Command Window 打印出来,或者保存在变量中。 与 system
类似的还有 dos
函数和 unix
函数,我觉得它们都是对 system
函数的一种包装,而 Matlab 的 system
函数也许是对 C 的库函数system
的包装。
先编写一个调用 Python 脚本的 matlab 程序即 python.m
function [result status] = python(varargin)
% call python
%命令字符串
cmdString='python';
for i = 1:nargin
thisArg = varargin{i};
if isempty(thisArg) | ~ischar(thisArg)
error(['All input arguments must be valid strings.']);
elseif exist(thisArg)==2
%这是一个在Matlab路径中的可用的文件
if isempty(dir(thisArg))
%得到完整路径
thisArg = which(thisArg);
end
elseif i==1
% 第一个参数是Python文件 - 必须是一个可用的文件
error(['Unable to find Python file: ', thisArg]);
end
% 如果thisArg中有空格,就用双引号把它括起来
if any(thisArg == ' ')
thisArg = ['"''"', thisArg, '"'];
end
% 将thisArg加在cmdString后面
cmdString = [cmdString, ' ', thisArg]
end
%发送命令
[status,result]=system(cmdString);
end
就可以用这个函数调用 python 脚本了。 下面就来个调用 python 脚本 matlab_readlines.py
(保存在 matlab 当前目录)的例子:
import sys
def readLines(fname):
try:
f=open(fname,'r')
li=f.read().splitlines()
cell='{'+repr(li)[1:-1]+'}'
f.close()
print cell
except IOError:
print "Can't open file "+fname
if '__main__'==__name__:
if len(sys.argv)<2:
print 'No file specified.'
sys.exit()
else:
readLines(sys.argv[1])
这个脚本用来读取一个文本文件,并生成 Matlab 风格的 cell 数组的定义字符串,每个单元为文本的一行。 放了一个测试用的文本文件 test.txt
在Matlab 的 Current Directory 中,内容如下:
This is test.txt
It can help you test python.m
and matlab_readlines.py
测试:
在 Matlab 的 Command Window 中输入:
str = python('matlab_readlines.py','test.txt');
eval(['c = ' str])
celldisp(c)
下面我举一个 python 转 matlab 的例子:
HDF5 转 .mat
首先引入 Bunch 转换为 HDF5 文件:高效存储 Cifar 等数据集 封装的 X.h5
数据集。
# 载入必备的库和数据
import tables as tb
import scipy.io as sio
h5 = tb.open_file('E:/xdata/X.h5')
fm = h5.root.fashion_mnist # 获取 fashion_mnist 数据
mdict = {
'testX':fm.testX[:].reshape((fm.testX.shape[0], -1)),
'trainX':fm.trainX[:].reshape((fm.trainX.shape[0], -1)),
'trainY':fm.trainY[:],
'testY':fm.testY[:],
}
sio.savemat('fashion_mnist', mdict) # 保存到本地 fashion_mnist.mat
python 与 matlab 混编的更多相关文章
- C# MATLAB混编(一)
参照这篇博客进行的C# MATLAB混编学习,学习过程中文章中的一些问题我并没有遇到,但是我遇到了一些新问题,这些问题的解决办法将在下一篇博客给出. 配置环境:vs2010(64位)+Matlab20 ...
- C# MATLAB混编(二)
在上一篇博客中说到按照参考教程操作之后依然有两个问题. 问题1:当我在matlab中输入mbuild -setup后 报错 解:这是因为VS与Matlab存在版本匹配问题,理论上来说vs版本最好 ...
- Matlab与.NET混编解决人脸识别问题
原文 http://www.cnblogs.com/asxinyu/archive/2013/05/29/3107013.html 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的 ...
- python和C语言混编的几种方式
Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Pytho ...
- Matlab.NET混编技巧之——找出Matlab内置函数
原文 http://www.cnblogs.com/asxinyu/p/3295309.html Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯 定不难.反之,有时 ...
- Matlab与C混编的介绍
原本写给一个朋友的,帮助她入门matlab与C混编的 >#####环境: * Matlab:MATLAB R2013a * C编译器VC++2012 === #####配置环境: 在**Matl ...
- Python+C混编
Python最慢!C最快!Python+C混编?结果可想而知! 樱桃种子 百家号04-1712:11 共享库 使用C语言编译产生共享库,然后python使用ctype库里的cdll来打开共享库. 举例 ...
- Python和C|C++的混编(二):利用Cython进行混编
还能够使用Cython来实现混编 1 下载Cython.用python setup.py install进行安装 2 一个实例 ① 创建helloworld文件夹 创建helloworld.pyx,内 ...
- Matlab高级教程_第二篇:一个简单的混编例子
1. 常用的混编是MATLAB和VS两个编辑器之间的混编方式. 2. 因为MATLAB的核是C型语言,因此常见的混编方式是MATLAB和C型语言的混编. 3. 这里介绍一个简单的MATLAB语言混编成 ...
随机推荐
- javascript的未知尺寸图片保持比例水平垂直居中函数
JavaScript的图片在容器内水平垂直居中的函数,利用图片加载获取图片大小,使之在父节点内水平垂直居中 展示方式有两种: 1.当参数keepImageFull为true:保持图片比例,使图片可完整 ...
- [转载]Javascript 同步异步加载详解
http://handyxuefeng.blog.163.com/blog/static/4545217220131125022640/ 本文总结一下浏览器在 javascript 的加载方式. 关键 ...
- 使用JavaScript 修改浏览器 URL 地址栏
现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不 ...
- WebService环境变量
将axis2部署到tomcat的webapps文件夹下: 因为该路径用于自动部署Web应用,将Web应用复制在该路径下,tomcat会将应用自动部署在容器中. AXIS_LIB:F:\tomcat\w ...
- 简单的多对一传输ns2仿真
实验名称:简单的多对一传输仿真 实验目的:1.研究怎么实现多对一传输. 实验步骤: 1.写c++代码并注册报文头. 先说一下多对一传输的方式.最开始,接收端发送控制报文给所有的发送端,告诉他们要发送多 ...
- 【转】java格式化输出 printf 例子
[转]java格式化输出 printf 例子 转自http://www.cnblogs.com/TankMa/archive/2011/08/20/2146913.html#undefined imp ...
- LintCode 412: Candy
LintCode 412: Candy 题目描述 有 N 个小孩站成一列.每个小孩有一个评级. 按照以下要求,给小孩分糖果: 每个小孩至少得到一颗糖果. 评级越高的小孩可以得到更多的糖果. 需最少准备 ...
- Anaconda+django写出第一个web app(五)
今天开始学习网页风格和设计,就像python有Web框架一样,也有一些CSS框架.对于CSS框架,我们可以使用默认的样式,也可以在原基础上编辑修改.本教程使用的是materialize这个CSS框架[ ...
- 【算法学习】manacher
manacher太水了. 这篇blog不能称作算法学习,因为根本没有介绍…… 就贴个模板,太简单了…… #include<cstdio> #include<cstring> # ...
- win10安装
1.启动盘制作 首先我们需要登陆“微软中国下载中心”,从中下载一款名为“MediaCreationTool”的工具,利用该工具可以制作Win10安装U盘.直接通过以下地址快速进入“Windows下载中 ...