15

matlab2012bから生成された.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から移植しようとしています。どんな助けでもいただければ幸いです。

ありがとうございました。

4

1 に答える 1

11

残念ながら、SciPyは新しいスタイルのクラスオブジェクト(で定義されたものclassdef)を含むマットファイルをサポートしていません。また、私が知る限り、サードパーティのマットファイルリーダーもサポートしていません。返された辞書のその__function_workspace__要素には、mat文書化されていない、まだリバースエンジニアリングされていない方法で、必要な情報が含まれています。

struct最も簡単な解決策は、カスタムクラスをディスクに保存する前に、Matlab内で基本オブジェクトに変換することです。これは、(警告はありますが)を呼び出すだけで実行できますstruct(futureDS)。すべてのパブリックプロパティとプライベートプロパティをプレーンフィールドとして公開します。これは、その価値のあるサードパーティのリーダーが読み取ることができます。

(より技術的には、MatlabはこれらのオブジェクトをMatlab配列タイプID 17で保存します。公式ドキュメント(PDF)は15までのタイプのみを列挙します)。

于 2013-08-16T23:50:37.513 に答える