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

Pau*_*ulD 11 python matlab class mat-file

我有一个从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')])}
Run Code Online (Sandbox Code Playgroud)

我希望访问类型为"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')])
Run Code Online (Sandbox Code Playgroud)

我被困在这里.我是python的新手,并试图从matlab移植我的旧工作.任何帮助,将不胜感激.

谢谢.

Mat*_* B. 6

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

最简单的解决方案是在将自定义类struct保存到磁盘之前,将其自定义类转换为Matlab中的基本对象。只需调用即可实现(尽管有警告)struct(futureDS)。它将所有公共和私有属性公开为纯字段,任何值得其赞扬的第三方读者都可以阅读。

(从技术上讲,Matlab用Matlab数组类型ID为17保存这些对象;官方文档(PDF)仅枚举类型直至15)。

  • 作为后记,我设法对许多这种格式进行了反向工程。[有关详细信息,请参见IJulia笔记本](http://nbviewer.ipython.org/gist/mbauman/9121961)。 (3认同)