2013-03-19 1 views
8

У меня есть .mat файл, созданный из matlab 2012b. Он содержит переменную с определяемым пользователем классом matlab.Доступ к файлу .mat, содержащему классы matlab в python

При загрузке файла с помощью scipy.io.loadmat в питоне 3.3, я получаю следующее:

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», но, кажется, не в состоянии сделать поэтому используйте мат ['None']. Вызывающий мат ['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), а также никакой сторонний читатель матового файла, насколько мне известно. Этот элемент __function_workspace__ в возвращаемом словаре mat содержит информацию, которую вы запрашиваете в некоторых недокументированных и пока еще не обратных версиях.

Самое легкое решение состоит в том, чтобы преобразовать ваши пользовательские классы в базовые объекты struct в Matlab, прежде чем сохранять их на диск. Это может быть достигнуто (хотя и с предупреждением), просто позвонив struct(futureDS). Он предоставляет все публичные и частные свойства как простые поля, которые могут быть прочитаны любым сторонним читателем, заслуживающим его соли.

(Технически Matlab сохраняет эти объекты с идентификатором типа Matlab Array 17, а official documentation (PDF) перечисляет только типы до 15).

+2

В качестве постскриптума мне удалось перепроектировать много такого формата. [См. Этот блокнот IJulia] (http://nbviewer.ipython.org/gist/mbauman/9121961). –