2013-03-19 2 views
8

matlab 2012b에서 생성 된 .mat 파일이 있습니다. 그것은 사용자 정의 matlab 클래스와 변수가 포함되어 있습니다.Python에서 matlab 클래스를 포함하는 .mat 파일에 액세스

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"개체에 액세스하기 위해 찾고 있지만, 할 수없는 것입니다 : 파이썬 3.3 scipy.io.loadmat을 사용하여 파일을로드 할 때

, 나는 다음과 같은 수 그래서 mat [ '없음']을 사용합니다. 매트 [ '없음']을 호출하면 간단한 결과가 표시됩니다.

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으로 정의 된 파일)를 포함하는 매트 파일을 지원하지 않으며 제 3 자 매트 파일 판독기도 알고 있습니다. 반환 된 mat 사전에있는 __function_workspace__ 요소에는 문서화되지 않았거나 리버스 엔지니어링되지 않은 방식으로 정보가 포함되어 있습니다.

가장 쉬운 방법은 사용자 지정 클래스를 Matlab 내의 기본 struct 개체로 변환하여 디스크에 저장하는 것입니다. 이것은 단순히 struct(futureDS)을 호출하여 (경고와 함께) 달성 될 수 있습니다. 모든 공개 및 비공개 속성을 일반 필드로 표시합니다.이 필드는 소금이있는 제 3 자 독자가 읽을 수 있습니다.

(보다 기술적으로 Matlab은 Matlab Array 유형 ID가 17 인이 객체를 저장하며 official documentation (PDF)은 15까지의 유형 만 열거합니다.)

+2

포스트 스크립트로이 형식을 많이 리버스 엔지니어링 할 수있었습니다. [자세한 내용은이 줄리아 노트] (http://nbviewer.ipython.org/gist/mbauman/9121961)를 참조하십시오. –

관련 문제