python与matlab混合编程_python 与 matlab 混编

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

# 载入必备的库和数据

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四川中级职称计算机考试考b级,四川省职称计算机B级考试1卷

一、单选题&#xff1a;(每题一分)1、安装调制调器不需要( )A.选择生产厂商和Modem型号B.Modem连接的端口C.选择所在国家及外拨电话号码D.选择的Modem的尺寸2、在Windows中&#xff0c;窗口还原是指将窗口还原到原来指定的( )A.窗口 B.尺寸C.图标 D.程序3、在Windows中&#xf…

如果有人问你什么是大数据?不妨说说这10个典型的大数据案例

在听Gartner的分析师Doug Laney用55分钟讲述55个大数据应用案例之前&#xff0c;你可能对于大数据是否落地还心存疑虑。Laney的演讲如同莎士比亚的全集一样&#xff0c;不过可能“缺乏娱乐性而更具信息量”&#xff08;也许对于技术人员来说是这样的&#xff09;。 这个演讲是对…

收藏的RabbitMQ资料,分享给大家

WhyRabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的…

网络游戏外挂制作

我一直没有搞懂制作加速外挂是怎么一回事&#xff0c;直到前不久又翻出来了2001年下半期的《程序员合订本》中《“变速齿轮”研究手记》重新回味了一遍&#xff0c;才有了一点点开悟&#xff0c;随后用Delphi重写了一遍&#xff0c;下面我就把我的心得说给大家听听&#xff0c;…

各高校寒假时间公布_高校放假哪家长?多所高校寒假时间公布!

11月25日2021年放假安排公布大家发现2020年已经接近尾声对于学生族来说考试近了寒假也快到了快来看看高校放假哪家长&#xff1f; (如有调整变动&#xff0c;以各高校最新通知为准)山东大学1月11日开始放假到2月28日结束寒假一共49天山东师范大学1月31日开始放假到3月6日结束寒…

ASP.NET Core 对Controller进行单元测试

单元测试对我们的代码质量非常重要。很多同学都会对业务逻辑或者工具方法写测试用例&#xff0c;但是往往忽略了对Controller层写单元测试。我所在的公司没见过一个对Controller写过测试的。今天来演示下如果对Controller进行单元测试。以下内容默认您对单元测试有所了解&#…

12对胸椎对应体表标志_铁路信号之信号表示器及标志(三)

信 号 标 志1.信号标志&#xff0c;设在列车运行方向左侧&#xff08;警冲标除外&#xff09;。双线区段的轨道电路调谐区标志设在线路外侧。&#xff08;1&#xff09;警冲标&#xff1a;设在两会合线路线间距离为4 m的中间。线间距离不足4m时&#xff0c;设在两线路中心线最大…

计算机技术题目,计算机技术题目.doc

计算机技术题目一、单项选择题(共10小题&#xff0c;每小题2分)1.下列选项不是生物识别中的行为特征的是() A.?虹膜 B.?声音 C.?签字 D.?步态2.下列关于云计算技术描述&#xff0c;错误的是() A.?云计算技术是分布式计算技术的一种 B.?搜索引擎是云计算技术的应用之一 C.…

python 画树 递归_python递归函数绘制分形树的方法

分形几何学的基本思想&#xff1a;客观事物具有自相似性的层次结构&#xff0c;局部和整体在形态&#xff0c;功能&#xff0c;信息&#xff0c;时间&#xff0c;空间等方面具有统计意义上的相似性&#xff0c;称为自相似性&#xff0c;自相似性是指局部是整体成比例缩小的性质…

mui 时间样式错乱_微信编辑器样式排版错位怎么回事?

有小伙伴反映在使用365编辑器时遇到素材样式无法正常使用的情况&#xff0c;出现排版错乱的情况&#xff0c;今天猫头鹰针对这个问题写了一篇避坑指南&#xff0c;或许能帮到小伙伴们~365微信编辑器样式排版错位怎么回事&#xff1f;这种情况的发生其实是排版过程中的错误操作导…

CISCO路由器安全配置

hostname Router1 &#xff1b;路由器名称 enable secret xxxx &#xff1b;特权访问口令为 xxxx interface serial 0 &#xff1b;定义接口 deion To Internet &#xff1b; 目的描述 ip address 162.70.73.33 255.255.255.248 &#xff1b;设置IP地址 ip access-list 101 in …

海德汉编程详细手册_UG编程海德汉系统螺旋铣孔最后一刀欠切解决方案

&#xfeff; 提示&#xff1a;点击上方"NX网"↑ 免费订阅 关注老叶今天给大家分享一个海德汉螺旋铣孔最后一圈不加工&#xff1a;新建一个模型&#xff0c;只要是深度不能整除螺距&#xff0c;都会存在这样的问题OK 新建一个默认后处理用来测试最后一圈确实存在问题…

软件测试基础知识bbst,摘自James Bach对软件测试新手的建议

Automated? Manual? There is no such thing as manual or automated testing. It’s all just testing. Testing is often supported by tools that attempt to simulate user interaction with the system. This is what people call “test automation” even though it i…

python实例方法、类方法、静态方法的区别_Python 实例方法、类方法、静态方法的区别与作用...

Python 实例方法、类方法、静态方法的区别与作用 一、总结 一句话总结&#xff1a; 实例方法&#xff1a;第一个参数必须是实例对象&#xff0c;该参数名一般约定为“self”&#xff0c;通过它来传递实例的属性和方法&#xff08;也可以传类的属性和方法&#xff09; 类方法&am…

逝者如斯,且听我胡说八道

【导读】嗯、转瞬即逝&#xff0c;还未来得及转身&#xff0c;2020就又这么溜了&#xff0c;溜了&#xff0c;趁其弥留之际&#xff0c;通过小作坊对2020年做个基本总结当我决心要写一篇总结时&#xff0c;我发现我要完了&#xff0c;这可不是一两个小时就能搞定的事情&#xf…

make: *** 没有规则可制作目标“distclean”。 停止。_Makefile伪目标

这一个章节我们主要讲的是 Makefile 中的伪目标。所谓的伪目标可以这样来理解,它并不会创建目标文件,只是想去执行这个目标下面的命令。伪目标的存在可以帮助我们找到命令并执行。使用伪目标有两点原因: 避免我们的 Makefile 中定义的只执行的命令的目标和工作目录下的实际文…

Lighttpd

Lighttpd Lighttpd是一个新兴的、轻量级的 web 服务器&#xff0c;它开始越来越多的应用在一些重要场合&#xff0c;如&#xff1a;YouTobe、Sourceforge、豆瓣…… Lighttpd 以安全、快速和内存消耗低著称&#xff0c;还专门为大型分布式连接环境做了优化&#xff0c;支持 Fas…

汇总:2017 年 IT 界最严重的裁员事件

裁员年年都有&#xff0c;今年特别多从微软、Oracle、IBM&#xff0c;到思科、HPE&#xff0c;再到雅虎、stackoverflow&#xff0c;无论是处于转型变革中的老牌巨头&#xff0c;还是日渐成熟的创新型公司&#xff0c;在动荡的科技行业&#xff0c;裁员风波一浪高过一浪&#x…

计算机结构优化,计算机结构与程序优化.ppt

《计算机结构与程序优化.ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《计算机结构与程序优化.ppt(116页珍藏版)》请在人人文库网上搜索。1、计算机结构与程序优化,Introduction to Intel 64 Architectures Optimization,Main Purpose,处理器架构简介 SIMD指令介…