2013-03-19 27 views
8

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

当加载在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中移植我的旧作品。任何帮助,将不胜感激。

谢谢。

回答

4

遗憾的是,就我所知,SciPy不支持包含新样式类对象(使用classdef定义的那些)的mat文件,也不支持任何第三方mat文件读取器。返回mat字典中的__function_workspace__元素包含您以某种未公开且尚未反向工程的方式记录的信息。

最简单的解决方案是将您的自定义类转换为Matlab中的基本struct对象,然后将它们保存到磁盘。这可以通过简单地呼叫struct(futureDS)来实现(虽然有警告)。它将所有公共和私有财产公开为私人财产,任何第三方读者都可以阅读这些财产。

(更为技术上,Matlab保存这些对象的Matlab阵列类型ID为17; official documentation (PDF)仅枚举类型直到15)。

+2

作为后记,我设法逆向工程了很多这种格式。 [见IJulia笔记本](http://nbviewer.ipython.org/gist/mbauman/9121961)了解详情。 – 2014-10-25 16:24:54

相关问题