python调用matlab的原因是啥?有哪些问题需要注意?
Admin 2021-05-21 群英技术资讯 856 次浏览
有时候我们需要用python调用matlab,但是不少朋友在python调用matlab事,会遇到一些问题,因此这篇文章就分享一下如何解决python调用matlab的几个常见问题。
我自己的有些数据结构涉及到hash查找,在python中key是tuple形式,在matlab中支持hash查找的数据结构只有containers.Map(),并不能支持cell作为key。尝试过把向量转为string,但是num2str和str2mat的效率不高,containers.Map()的查找耗时也非常的长,所以只好作罢。后来发现可以用python通过matlab的API直接调用matlab的函数参与运算,朋友的经验说矩阵运算都交给matlab来计算就很快了。
但是摸索过程中发现一些问题,在网络上基本找不到,自己全靠摸索发现解决方式,写在这里,如果能给大家带来帮助,那就很好了。
这里以py2.7和Spyder的anaconda为例。
这个包直接搜索到官网上下载即可。也可以尝试pip,我已经忘了当时怎么装上的了。
装好之后,使用示例如下:
from mlab.releases import latest_release as matlab import os path = os.getcwd() mat.path(mat.path(),path) # 添加当前脚本所在路径到matlab的环境中 ......
所有的matlab(包括自定义函数)的可以通过matlab.xxxx()的方式调用。
mlab包的优点
matlab中的所有变量都是矩阵形式的,到python中会自动转为numpy的array形式,非常方便。
mlab包的缺点
这是最大的BUG!那就是自定义函数在通过mlab在python中调用之后,就好像编译只读了一样,此后对.m文件的任何修改都不起作用,不管是重新启动python的kernel、重新启动spyder、重新import mlab、删除.m文件重建同名函数.m文件,都行不通。删除了.m文件,python报错,除非重新命名一个新函数后调用,那么这个新函数同样面临无法修改的问题。
除非重启电脑。
因此我选择了另一个方式,也是matlab官网介绍的方式。
matlab官网的链接:MATLAB API for Python。
安装过程:
1、在matlab安装路径中,找到”R2016b\extern\engines\python”,每个人安装路径不一样,找到末尾一致路径即可
2、这里注意区分,通过anaconda prompt打开其命令行,依次执行:d: -C>cd D:\Program Files\MATLAB\R2016b\extern\engines\python,即切换路径到matlab的python的setup.py下
3、官方还给出了较全的安装方案,跟着做就好:在非默认位置安装用于 Python 的 MATLAB 引擎 API
4、安装完成后,python中就可测试以下内容了:
#coding=utf-8 import matlab.engine from numpy import * if __name__ == '__main__': eng = matlab.engine.start_matlab() A = matlab.double([[1,2],[5,6]]) print(type(A),A.size,A) print(eng.eig(A)) eng.quit() pass
matlab.engine包的优点
这是matlab官方介绍的方法,不会出现mlab的那种问题,可以边写程序边调试没问题了。
matlab.engine包的缺点
使用的变量中有许多的matlab类,其中一些在spyder的Variable explorer中无法显示,必须人为打印。另外就是必须注意python变量类型和matlab变量类型的对应关系,matlab给出了一张表:Pass Data to MATLAB from Python。
我习惯上会把变量以list的方式 [1,2,3] 传入到matlab的函数中,这样matlab里面实际认为是cell,调试中遇到了很多次,实际上如果只传数值到函数中,需要在python中将变量设置为 matlab.double([1,2,3]) 传入才正常。
matlab.double类型的变量,可以通过numpy.asarray方式转为array类型的变量,方便在python中处理。
matlab中的函数返回到python中的值默认为1个,需要在函数中增加一个参数nargout=n,如果n与返回的个数不一致,python会报错。
官方介绍的matlab.engine更好用。matlab负责处理矩阵计算,python用以解决hash查找的数据结构。目前还在开发初期阶段,并不知道数据在python和matlab之间的通信效率高不高。
第一次写总结,主要是为了给自己总结用,避免以后发生同样的错误。考虑到网络上相关问题的中文介绍非常少,能找到的都是抄过来抄过去的基础配置问题,我这里分享出来,以期能够帮助到其他朋友。
补充:python调用matlab问题解决小建议
软件及python位数要一致,cmd进行build和install时需要管理员权限运行。多个版本的情况下,需要使用python、python2、python3进行python2 setpy.py build这样
函数的参数一般需要matlab.double转换或者参数赋值时直接改为double型
import matlab.engine eng = matlab.engine.start_matlab()
需要保证你的函数或脚本就在当前的工作路径下,也就是说要把m文件放到python程序中去
matlab.double([44100]) matlab.double([[1.0,1.4142135623730951,1.7320508075688772,2.0,2.23606797749979]]) signal = eng.hanshu(matlab.double([44100]), matlab.double([3000]), matlab.double([5]))
默认情况下,API认为接收函数返回结果的参数有1个。
这会导致没有返回值的函数在被调用时报错:“Too many output arguments”或是多个返回值的情况下只返回并得到第一个返回值
我们可以人为指定输出参数为0个来避免这样的错误。
eng.hanshu(canshu, nargout=2)
以上为个人经验,关于python调用matlab的原因以及相关问题就介绍到这,希望对大家能有帮助,想要了解更多python调用matlab的内容,还可以关注其他相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Python内置函数-type()函数。type() 函数如果你只有第一个参数则返回对象的类型,三个参数返回新的类型对象。
Python矩阵输入python输入(数组、矩阵)一维输入对应不同变量一维数组的输入问题二维数组的输入问题Python矩阵输入经常在尝试python一些函数功能时想随便输入一个矩阵感
要想在Flask中处理好异常,有一套自己的异常处理机制,首先,我们必须先知道Flask自己是如何处理异常的。去flask的源码里找一找会发现,在flask源码的app.py文件下,有很多会抛出异常的方法,其中拿一个举例:
这篇文章主要为大家介绍了python读写json文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
这篇文章主要为大家介绍了python人工智能tensorflow函数tensorboard使用方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008