gpt4 book ai didi

python - 在 python 中访问包含 matlab 类的 .mat 文件

转载 作者:太空狗 更新时间:2023-10-29 18:08:18 27 4
gpt4 key购买 nike

我有一个从 matlab 2012b 生成的 .mat 文件。它包含一个带有用户定义的 matlab 类的变量。

在 python 3.3 中使用 scipy.io.loadmat 加载文件时,我得到以下信息:

mat=scipy.io.loadmat('D:\test.mat')
mat
{'__header__': b'MATLAB 5.0 MAT-file, Platform: PCWIN64, Created on: Fri Feb 22 15:26:28 2013', '__function_workspace__': array([[ 0, 1, 73, ..., 0, 0, 0]], dtype=uint8), '__globals__': [], '__version__': '1.0', 'None': MatlabOpaque([ (b'futureDS', b'MCOS', b'cStream', [[3707764736], [2], [1], [1], [1], [1]])],
dtype=[('s0', 'O'), ('s1', 'O'), ('s2', 'O'), ('arr', 'O')])}

我想访问类型为“cStream”的“futureDS”对象,但使用 mat['None'] 似乎无法做到这一点。调用 mat['None'] 简单结果:

MatlabOpaque([ (b'futureDS', b'MCOS', b'cStream', [[3707764736], [2], [1], [1], [1], [1]])], 
dtype=[('s0', 'O'), ('s1', 'O'), ('s2', 'O'), ('arr', 'O')])

我被困在这里了。我是 python 的新手,正在尝试从 matlab 移植我的旧作品。任何帮助将不胜感激。

谢谢。

最佳答案

不幸的是,SciPy 不支持包含新型类对象(使用 classdef 定义的对象)的 mat 文件,据我所知也不支持任何第三方 mat 文件阅读器。返回的 mat 字典中的 __function_workspace__ 元素包含您以某种未记录且尚未逆向工程的方式获取的信息。

最简单的解决方案是在将自定义类保存到磁盘之前,将它们转换为 Matlab 中的基本 struct 对象。这可以通过简单地调用 struct(futureDS) 来实现(尽管有警告)。它将所有公共(public)和私有(private)属性公开为普通字段,任何值得一试的第三方读者都可以阅读。

(从技术上讲,Matlab 使用 17 的 Matlab 数组类型 id 保存这些对象;official documentation (PDF) 仅枚举 15 以内的类型)。

关于python - 在 python 中访问包含 matlab 类的 .mat 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15512560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com