• 售前

  • 售后

热门帖子
入门百科

办理python调用matlab时的一些常见题目

[复制链接]
123457399 显示全部楼层 发表于 2021-10-26 13:29:38 |阅读模式 打印 上一主题 下一主题
为什么要用python调用matlab?

我本身的有些数据结构涉及到hash查找,在python中key是tuple形式,在matlab中支持hash查找的数据结构只有containers.Map(),并不能支持cell作为key。
尝试过把向量转为string,但是num2str和str2mat的服从不高,containers.Map()的查找耗时也非常的长,所以只好作罢。
厥后发现可以用python通过matlab的API直接调用matlab的函数到场运算,朋侪的履历说矩阵运算都交给matlab来计算就很快了。
但是摸索过程中发现一些题目,在网络上根本找不到,本身端赖摸索发现办理方式,写在这里,假如能给大家带来帮助,那就很好了。
设置python以调用matlab的API

python情况

这里以py2.7和Spyder的anaconda为例。
通过mlab库

这个包直接搜索到官网上下载即可。也可以尝试pip,我已经忘了当时怎么装上的了。
装好之后,使用示比方下:
  1. from mlab.releases import latest_release as matlab
  2. import os
  3. path = os.getcwd()
  4. mat.path(mat.path(),path) # 添加当前脚本所在路径到matlab的环境中
  5. ......
复制代码
全部的matlab(包罗自定义函数)的可以通过matlab.xxxx()的方式调用。
mlab包的优点
matlab中的全部变量都是矩阵形式的,到python中会自动转为numpy的array形式,非常方便。
mlab包的缺点
这是最大的BUG!那就是自定义函数在通过mlab在python中调用之后,就似乎编译只读了一样,以后对.m文件的任何修改都不起作用,不管是重新启动python的kernel、重新启动spyder、重新import mlab、删除.m文件重修同名函数.m文件,都行不通。删除了.m文件,python报错,除非重新定名一个新函数后调用,那么这个新函数同样面临无法修改的题目。
除非重启电脑。
因此我选择了另一个方式,也是matlab官网先容的方式。
通过matlab.engine

matlab官网的链接:MATLAB API for Python。
安装过程:
1、在matlab安装路径中,找到”R2016b\extern\engines\python”,每个人安装路径不一样,找到末了同等路径即可
2、这里留意区分,通过anaconda prompt打开其下令行,依次实行:d: –>cd D:\Program Files\MATLAB\R2016b\extern\engines\python,即切换路径到matlab的python的setup.py下
3、官方还给出了较全的安装方案,跟着做就好:在非默认位置安装用于 Python 的 MATLAB 引擎 API
4、安装完成后,python中就可测试以下内容了:
  1. #coding=utf-8
  2. import matlab.engine
  3. from numpy import *
  4. if __name__ == '__main__':
  5. eng = matlab.engine.start_matlab()
  6. A = matlab.double([[1,2],[5,6]])
  7. print(type(A),A.size,A)
  8. print(eng.eig(A))
  9. eng.quit()
  10. 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型
  1. import matlab.engine
  2. eng = matlab.engine.start_matlab()
复制代码
须要包管你的函数或脚本就在当前的工作路径下,也就是说要把m文件放到python程序中去
  1. matlab.double([44100])
  2. matlab.double([[1.0,1.4142135623730951,1.7320508075688772,2.0,2.23606797749979]])
  3. signal = eng.hanshu(matlab.double([44100]), matlab.double([3000]), matlab.double([5]))
复制代码
默认情况下,API以为吸取函数返回效果的参数有1个。
这会导致没有返回值的函数在被调用时报错:“Too many output arguments”或是多个返回值的情况下只返回并得到第一个返回值
我们可以人为指定输出参数为0个来制止这样的错误。
  1. eng.hanshu(canshu, nargout=2)
复制代码
以上为个人履历,希望能给大家一个参考,也希望大家多多支持草根技能分享。如有错误或未思量完全的地方,望不吝赐教。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作