解决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

标签:python,调用,matlab
0
投稿

猜你喜欢

  • MYSQL 批量替换之replace语法的使用详解

    2024-01-21 19:52:35
  • insert...on duplicate key update语法详解

    2024-01-19 11:43:55
  • ASP.NET教程第一讲 ASP.NET简介

    2007-08-07 11:50:00
  • 自然描述与自然任务

    2010-01-26 15:51:00
  • Python可视化模块altair的使用详解

    2023-10-03 09:00:28
  • Python之Pygame的Event事件模块

    2021-07-17 06:18:40
  • 盘点30个经典常用的JavaScript知识点

    2024-05-13 09:36:06
  • Python写安全小工具之TCP全连接端口扫描器

    2023-12-30 13:34:52
  • 聚族索引、非聚族索引、组合索引的含义和用途

    2010-07-02 21:51:00
  • 五个常用MySQL图形化管理工具

    2012-01-05 18:49:16
  • PyQt5 多窗口连接实例

    2021-06-17 01:32:09
  • Python常用数据类型之间的转换总结

    2023-06-21 10:06:21
  • Python比较配置文件的方法实例详解

    2021-11-27 05:54:35
  • 通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法

    2024-04-17 10:06:38
  • Go语言正则表达式示例

    2023-04-13 19:41:34
  • python 判断是否为正小数和正整数的实例

    2022-06-12 01:26:04
  • Python符号计算之实现函数极限的方法

    2021-09-05 02:02:21
  • Vue提供的三种调试方式你知道吗

    2024-05-29 22:44:57
  • mysql 8.0.15 winx64解压版安装配置方法图文教程

    2024-01-26 07:11:18
  • MySQL的root帐户密码重置方法

    2007-08-24 15:53:00
  • asp之家 网络编程 m.aspxhome.com