2013-03-19 120 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