解决python调用matlab时的一些常见问题
作者:杭州卡耐基 发布时间:2022-10-13 16:11:01
为什么要用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,我已经忘了当时怎么装上的了。
装好之后,使用示例如下:
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.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中就可测试以下内容了:
#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会报错。
来源:https://blog.csdn.net/weixin_43911146/article/details/84716907
猜你喜欢
- 数组排序排序是指将元素按有序顺序排列。有序序列是拥有与元素相对应的顺序的任何序列,例如数字或字母、升序或降序。NumPy ndarray 对
- pygame介绍Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows、Linux、Mac O
- 为了更好的说明问题,首先引出下面的题目//请说明下面变量 a-d 的值 var a = [[1][1]]; var b = [['a
- pLSA(probabilistic Latent Semantic Analysis),概率潜在语义分析模型,是1999年Hoffman提
- 最近写了一个软件屡屡打包不能正常运行,而直接在cmd命令行窗口运行却都能正常输出,没有任何报错,一开始怀疑程序里面sys.args[1]使用
- 看着自己少得可怜的访问量,突然有一个想用爬虫刷访问量的想法,主要也是抱着尝试的心态,学习学习。其实市面上有一些软件可以代刷流量 比如 流量精
- <?php /** * 单例模式 * * 保证一个类仅有一个实例,并提供一个访问它的全局访问点 * */ class Singleto
- 概述最近在一家公司实习,入职第一个大一点的需求是将公司开发的两个winstore app的排名信息进行可视化。大概挑选了下,排除了Flask
- css实现的圆角矩形的方式很多,但要追求灵活型,上面的结构简单,看起来爽一点注意css所用的图片路径,已修改兼容ie6 ie7 ff ,IE
- pythonDES加密与解密以及hex输出和bs64格式输出具体代码如下所示:import pyDesimport base64Key =
- torch.autograd.backward(variables, grad_variables=None, retain_graph=N
- NumPy数组(2、数组的操作)基本运算数组的算术运算是按元素逐个运算。数组运算后将创建包含运算结果的新数组。>>> a=
- python的数据类型有:数字(int)、浮点(float)、字符串(str),列表(list)、元组(tuple)、字典(dict)、集合
- 1. resize函数说明 OpenCV提供了resize函数来改变图像的大小,函数原型如下:void resiz
- 描述 嵌入在你的web页面中的导航元素能够降低你的搜索引擎评价排名并且降低你的网站的响应性能。本文作者想同你一起探讨如何使用AJAX技术来解
- 这篇文章主要介绍了pyinstaller还原python代码过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 上篇文章讲了js中的一些概念(词法结构) 和 数据类型(部分)。这章我们 继续.然后了解下js中操作数据 和 函数的 作用域。1,对象跟基本
- 一、步骤要从 JPEG 图像中获取经纬度信息,可以使用 Python 的 PIL(Python Imaging Library)库。以下是一
- 不知道写得对不对啊!错了再改吧!加密函数Function Encodestr(s,xorstr)Dim enFor&nb
- 一个动态数组 a,如果你已经使用redim 语句给它设定了大小,那么在此之后使用 ubound(a) 就可以得到它的上边界。如果你没有使用