- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章解决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,我已经忘了当时怎么装上的了.
装好之后,使用示例如下:
1
2
3
4
5
|
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: –>cd D:\Program Files\MATLAB\R2016b\extern\engines\python,即切换路径到matlab的python的setup.py下 。
3、官方还给出了较全的安装方案,跟着做就好:在非默认位置安装用于 Python 的 MATLAB 引擎 API 。
4、安装完成后,python中就可测试以下内容了:
1
2
3
4
5
6
7
8
9
10
|
#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型 。
1
2
|
import
matlab.engine
eng
=
matlab.engine.start_matlab()
|
需要保证你的函数或脚本就在当前的工作路径下,也就是说要把m文件放到python程序中去 。
1
2
3
|
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个来避免这样的错误.
1
|
eng.hanshu(canshu, nargout
=
2
)
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.
原文链接:https://blog.csdn.net/weixin_43911146/article/details/84716907 。
最后此篇关于解决python调用matlab时的一些常见问题的文章就讲到这里了,如果你想了解更多关于解决python调用matlab时的一些常见问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
是否了解线程的同步和异步? 线程同步:多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 线程异步:在访问资源时在空闲等待时同时访问其他资源,实现多线程机制 是否了解网
常见问题 cat系统的定位 cat本质上一个实时监控系统,主要体现在监控报表Transaction、event、problem、heartbeat等,cat系统定制的监控模型以及定制的实时分
我正在使用PowerShell中的GUI并尝试制作表单,以便在构建表单之后,用户可以与表单的一部分(+/-按钮)进行交互,以向该表单动态添加一组控件现有集的下方。 例如,将有一个组合框(下拉菜单)用于
尝试读取/解析输入时,我的C程序出现问题。 救命? 这是一个常见问题解答条目。 StackOverflow有许多与读取C语言中的输入有关的问题,答案通常集中在特定用户的特定问题上,而没有真正描绘出整个
当我尝试读取/解析输入时,我的C程序出现问题。 救命? 这是一个常见问题解答条目。 StackOverflow有许多与读取C语言中的输入有关的问题,答案通常集中在特定用户的特定问题上,而没有真正描绘出
当我尝试读取/解析输入时,我的C程序出现问题。 救命? 这是一个常见问题解答条目。 StackOverflow有许多与读取C语言中的输入有关的问题,答案通常集中在特定用户的特定问题上,而没有真正描绘出
当我尝试读取/解析输入时,我的C程序出现问题。 救命? 这是一个常见问题解答条目。 StackOverflow有许多与读取C语言中的输入有关的问题,答案通常集中在特定用户的特定问题上,而没有真正描绘出
当我尝试读取/解析输入时,我的C程序出现问题。 救命? 这是一个常见问题解答条目。 StackOverflow有许多与读取C语言中的输入有关的问题,答案通常集中在特定用户的特定问题上,而没有真正描绘出
当我尝试读取/解析输入时,我的C程序出现问题。 救命? 这是一个常见问题解答条目。 StackOverflow有许多与读取C语言中的输入有关的问题,答案通常集中在特定用户的特定问题上,而没有真正描绘出
当我尝试读取/解析输入时,我的C程序出现问题。 救命? 这是一个常见问题解答条目。 StackOverflow有许多与读取C语言中的输入有关的问题,答案通常集中在特定用户的特定问题上,而没有真正描绘出
我不知道如何在 C++ 项目中使用 TDD,但我决定先使用“Google Mock Framework”。 但我有一个问题: 当我完成测试时,是否必须从 TDD 的宏、类等中清理我的代码? 换句话说,
我从 sourceForge 获得的这个源文件中有 26 个错误。它是 Stanford CS106B library 的一部分所以应该不会有任何错误。 错误示例: C2059:语法错误:'publi
处理现有的展开/折叠“FAQ” Accordion 页面并希望“展开/折叠”功能正常工作。 我设法让页面开始时所有内容都折叠起来,但是当我单击任何列展开然后单击另一列时,原始列不会折叠。 重要的是,我
可以从 MySQL 数据库获取“常见问题解答”。我有一个存储问题和答案的表。每天在我的网站上我们都会收到数千个问题。 现在我统计一下,我的数据库中有 142,283 个问题。我的想法是通过创建常见问题
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有以下 html。它由 bootstrap 和 css url 文件组成。它有两个 Accordion 项目选项卡。但是打开的时候发现有javascript错误。当我单击 Accordion 时,它
我观看/阅读/搜索了许多教程,但都没有成功。我坚持 this tutorial . 我正在尝试将带有 JS(可能仅 CSS)的 toogle acordion 效果应用到 div 而不定位。 有两种显
我讨厌问这个问题,因为它已经被问了一百万次,但答案似乎从来都不令人满意,而且大多数线程似乎都没有得到公认的答案就被放弃了。 这正是我需要做的(由于业力低,恶意网址是故意的): http://examp
我正在使用 CRNA v0.44 。我正在进行两个屏幕注册。我在第一个屏幕上,现在我想使用 react 导航转到第二个屏幕。 但是出现错误: undefined is not an object (e
我是一名优秀的程序员,十分优秀!