2013-03-19 3 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')])} 

私はタイプの「futureDS」オブジェクト「はCStream」にアクセスするために探したが、できませんでし思えていますので、マット['なし']を使用しています。マット['なし']を呼び出すと、次のようになります。

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辞書の__function_workspace__要素には、文書化されておらず、まだリバースエンジニアリングされていない方法で情報が含まれています。

最も簡単な解決策は、カスタムクラスをMatlab内の基本オブジェクトstructに変換してからディスクに保存することです。これは、単にstruct(futureDS)を呼び出すことによって(警告であっても)達成することができます。公開されているすべてのプロパティとプライベートプロパティをプレーンフィールドとして公開しています。これは、その価値のある第三者の読者が読むことができます。

(技術的には、MatlabはMatlab ArrayタイプIDが17のこれらのオブジェクトを保存します; official documentation (PDF)は15までのタイプのみを列挙します)。

+2

ポストスクリプトとして、私はこの形式を多くリバースエンジニアリングすることができました。 [このIJuliaノートブックを参照](http://nbviewer.ipython.org/gist/mbauman/9121961)。 –

関連する問題