2013-03-19 9 views
8

में मैटलैब कक्षाएं युक्त .mat फ़ाइल एक्सेस करें मेरे पास matlab 2012b से उत्पन्न एक .mat फ़ाइल है। इसमें एक उपयोगकर्ता द्वारा परिभाषित matlab वर्ग के साथ एक चर शामिल है।पायथन

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 का उपयोग कर फ़ाइल लोड, मैं निम्नलिखित मिल तो चटाई ['कोई नहीं'] का उपयोग कर। कॉलिंग मैट ['कोई नहीं'] सरल परिणाम:

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

मैं यहां फंस गया हूं। मैं अजगर के लिए नया हूं और मैटलैब से अपने पुराने काम को बंद करने की कोशिश कर रहा हूं। किसी भी सहायता की सराहना की जाएगी।

धन्यवाद।

उत्तर

4

दुर्भाग्यवश, SciPy उन मैट फ़ाइलों का समर्थन नहीं करता है जिनमें नई शैली के वर्ग ऑब्जेक्ट्स (classdef के साथ परिभाषित) शामिल हैं, और न ही किसी तीसरे पक्ष के मैट-फ़ाइल रीडर को जहां तक ​​मुझे पता है। __function_workspace__ लौटा mat डिक्शनरी में तत्व उस जानकारी में शामिल है जो आप बाद में कुछ अनियंत्रित और अभी तक नहीं-विपरीत-इंजीनियर तरीके से हैं।

सबसे आसान समाधान डिस्क पर सहेजने से पहले अपने कस्टम वर्गों को मूल struct वस्तुओं को मैटलैब के भीतर परिवर्तित करना है। यह struct(futureDS) पर कॉल करके (चेतावनी के बावजूद) हासिल किया जा सकता है। यह सभी सार्वजनिक और निजी गुणों को सादा फ़ील्ड के रूप में उजागर करता है, जिसे किसी भी तीसरे पक्ष के पाठक द्वारा इसके नमक के लायक पढ़ा जा सकता है।

(अधिक तकनीकी रूप से, मैटलैब इन वस्तुओं को 17 के मैटलैब ऐरे प्रकार आईडी के साथ सहेजता है; official documentation (PDF) केवल 15 के माध्यम से प्रकारों को दर्शाता है)।

+2

एक पोस्टस्क्रिप्ट के रूप में, मैंने इस प्रारूप के बहुत सारे इंजीनियर को उलटा करने में कामयाब रहे हैं। [विवरण IJulia नोटबुक] (http://nbviewer.ipython.org/gist/mbauman/9121961) विवरण के लिए। –