前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matlab调用python库函数和自定义脚本函数

matlab调用python库函数和自定义脚本函数

作者头像
HHTjim 部落格
发布2022-09-26 10:41:16
7220
发布2022-09-26 10:41:16
举报
文章被收录于专栏:HHTjim'S 部落格

matlab调用python库函数和自定义脚本函数

作者:matrix 被围观: 4,430 次 发布时间:2019-07-15 分类:零零星星 | 无评论 »

这是一个创建于 1143 天前的主题,其中的信息可能已经有所发展或是发生改变。

本来只是想获取字符串的MD5hash值,结果发现麻烦。首先去mathworks找到的DataHash,GetMD5这些函数要么无法使用,要么就是计算出来的md5值是错误的,反正达不到效果。

刚开始以为mathworks的代码必须登录账户才能下载,现在才发现,点击Overview旁边的Functions选项卡就能看到源代码。 😂

当初就算是找到了一些函数也是不能使用,最后还是使用python库来解决。好在matlab对python的调用非常简单。直接使用py库就好了,唯一的问题就是有些python的语法和matlab不同,比如切片[:::]操作这些。

安装python3环境

2019-08-19测试发现macos中3.7版本可以,但是在centOS中就调用失败。所以就centOS中测试安装3.5的版本了。

后面发现应该是编译时的enable-shared参数问题。

2020-02-18centos中测试可以直接用conda来安装python3.5使用,3.6,3.7测试调用失败!

开始手动编译安装

代码语言:javascript
复制
cd ~
yum install zlib-devel bzip2-devel openssl-devel ncurese-devel
wget https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz
tar xf  Python-3.5.0.tgz
cd Python-3.5.0
./configure --enable-shared #matlab要求必须设置enable-shared参数
make &&  make install

参考:

https://ww2.mathworks.cn/help/matlab/matlab_external/undefined-variable-py-or-function-py-command.html#buialof-67

https://ww2.mathworks.cn/help/matlab/getting-started-with-python.html?lang=en

切换默认的python解释器

matlab输入pyversion`可以查看python解释器路径,如果需要修改:

代码语言:javascript
复制
 pyversion /usr/local/bin/python3 %切换到python3.7指定路径

直接调用python内置函数

计算字符串md5函数

使用python的hashlib库进行操作

代码语言:javascript
复制
function[re]=md5(str)
    %{
        依赖python进行md5 hash
    %}
    m2 = py.hashlib.md5();
    m2.update(py.str(str).encode('utf-8'));
    re = char(m2.hexdigest());

说明:

此函数依赖python环境,确保系统中有安装。

兼容Linux,Mac,Windows

最后char函数是将py.str类型转换为matlab的str

知道了这个操作,以后很多操作就会非常简单。

比如

获取当前时间戳:
代码语言:javascript
复制
str2num(char(py.int(py.time.time())))

直接用py库来调用即可,最后再使用matlab函数str2num,char处理成number类型。

调用自定义.py脚本函数

上面的方法倒是可以解决一部分难题,但是遇到方括号[]、百分号%操作符这些直接在.m文件中就不会执行了。毕竟matlab是以它的语法来解析,这样只得起调.py文件来操作。

新建test.py文件位于当前工作目录

代码语言:javascript
复制
def func():
    return '123'[::-1]

载入python脚本:

代码语言:javascript
复制
%脚本所在路径,空字符串表示当前目录
path = '' %当前目录
%path = 'a/' %当前的子目录a
if count(py.sys.path,path) == 0
    insert(py.sys.path,int32(0),path);
end

%清除脚本缓存,执行重载操作
clear classes;
mod = py.importlib.import_module('test');%载入的脚本模块  
%mod = py.importlib.import_module('a.test');%载入的子目录下的脚本模块 
py.importlib.reload(mod);

调用py.test.func即可得到切片结果321,注意为py.str类型。

子目录形同:py.子目录.文件名.函数名

当修改py文件之后再调用会发现还是之前的结果,matlab缓存了之前的python脚本,所以这里需要clear classes...这类操作。

参考:

MATLAB 调用 Python

https://www.cnblogs.com/zknublx/p/6212590.html

https://blog.csdn.net/jnulzl/article/details/51170859

https://zhuanlan.zhihu.com/p/42598340

https://blog.csdn.net/x5675602/article/details/52134981

http://www.1cae.com/a/MatLab/52/python-matlab-8943.htm

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • matlab调用python库函数和自定义脚本函数
    • 安装python3环境
      • 切换默认的python解释器
        • 直接调用python内置函数
          • 调用自定义.py脚本函数
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档