Acceda al archivo .mat que contiene las clases de matlab en python

Tengo un archivo .mat generado desde matlab 2012b. Contiene una variable con una clase matlab definida por el usuario.

Al cargar el archivo con scipy.io.loadmat en Python 3.3, obtengo lo siguiente:

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')])} 

Estoy buscando acceder al objeto “futureDS” de tipo “cStream” pero parece que no puedo hacerlo usando mat [‘Ninguno’]. La llamada al tapete [‘Ninguno’] resulta simple en:

 MatlabOpaque([ (b'futureDS', b'MCOS', b'cStream', [[3707764736], [2], [1], [1], [1], [1]])], dtype=[('s0', 'O'), ('s1', 'O'), ('s2', 'O'), ('arr', 'O')]) 

Estoy atrapado aquí. Soy nuevo en Python y estoy tratando de portar mi antiguo trabajo desde Matlab. Cualquier ayuda sería apreciada.

Gracias.

Desafortunadamente, SciPy no admite archivos mat que contengan objetos de clase de estilo nuevo (aquellos definidos con classdef ), ni ningún lector de archivos mat de terceros, por lo que yo sé. Ese elemento __function_workspace__ en el diccionario mat devuelto contiene la información que está buscando de alguna manera no documentada y aún no diseñada a la inversa.

La solución más sencilla es convertir sus clases personalizadas en objetos de struct básica dentro de Matlab antes de guardarlos en el disco. Esto se puede lograr (aunque con una advertencia) simplemente llamando a struct(futureDS) . Expone todas las propiedades públicas y privadas como campos planos, que pueden ser leídos por cualquier lector externo que valga la pena.

(Más técnicamente, Matlab guarda estos objetos con el ID de tipo Matlab Array de 17; la documentación oficial (PDF) solo enumera los tipos hasta 15).