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

Posted

技术标签:

【中文标题】在 python 中访问包含 matlab 类的 .mat 文件【英文标题】:Access .mat file containing matlab classes in python 【发布时间】:2013-03-08 21:34:24 【问题描述】:

我有一个从 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 移植我的旧工作。任何帮助将不胜感激。

谢谢。

【问题讨论】:

【参考方案1】:

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

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

(从技术上讲,Matlab 以 17 的 Matlab Array 类型 id 保存这些对象;official documentation (PDF) 仅枚举最多 15 个类型)。

【讨论】:

作为附言,我已经设法对这种格式进行了很多逆向工程。 See this IJulia notebook了解详情。

以上是关于在 python 中访问包含 matlab 类的 .mat 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何访问数组并将其存储在python中的单个数组中(类似于matlab中的单元格)

Matlab 中的类和 switch 语句

matlab如何写一个类

python之self

Python--创建类的方法与成员访问

从 Python 访问 Matlab 时逃避轮询