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

作者:matrix

被围观: 3,129 次

发布时间:2019-07-15

分类:零零星星 |

无评论 »

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

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

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

python调用matlab函数_matlab调用python库函数和自定义脚本函数_第1张图片

当初就算是找到了一些函数也是不能使用,最后还是使用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测试调用失败!

开始手动编译安装

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解释器路径,如果需要修改:

pyversion /usr/local/bin/python3 %切换到python3.7指定路径

直接调用python内置函数

计算字符串md5函数

使用python的hashlib库进行操作

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

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

比如

获取当前时间戳:

str2num(char(py.int(py.time.time())))

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

调用自定义.py脚本函数

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

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

def func():

return '123'[::-1]

载入python脚本:

%脚本所在路径,空字符串表示当前目录

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...这类操作。

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

你可能感兴趣的:(python调用matlab函数_matlab调用python库函数和自定义脚本函数)