我有一个从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移植我的旧工作。任何帮助将不胜感激。
谢谢。
答案 0 :(得分:5)
不幸的是,SciPy不支持包含新式类对象(用classdef
定义的)的mat文件,据我所知,也没有任何第三方mat文件阅读器。返回的__function_workspace__
字典中的mat
元素包含您在某些未记录且尚未反向设计的方式中所获取的信息。
最简单的解决方案是在将自定义类保存到磁盘之前将其转换为Matlab中的基本struct
对象。这可以通过简单地调用struct(futureDS)
来实现(尽管有警告)。它将所有公共和私有属性公开为普通字段,任何第三方读者都可以阅读这些字段。
(从技术上讲,Matlab使用Matlab数组类型id为17保存这些对象; official documentation (PDF)仅枚举类型直到15)。