2008-10-20 20 views
14

मेरे पास MATLAB (संस्करण 7) में 30000x14000 स्पैर मैट्रिक्स है, जिसे मुझे किसी अन्य प्रोग्राम में उपयोग करने की आवश्यकता है। कॉलिंग सेव इसे एएससीआईआई (समर्थित नहीं) के रूप में नहीं लिखेंगे। इस राक्षस पर full() पर कॉलिंग Out of Memory त्रुटि में परिणाम।
मैं इसे कैसे निर्यात करूं?मैं एक टेक्स्ट फ़ाइल में एक बहुत बड़ा MATLAB स्पैर मैट्रिक्स कैसे सहेज सकता हूं?

उत्तर

3

मैंने इसे MATLAB के भीतर जावा का उपयोग करके टेक्स्ट के रूप में सहेजा। MATLAB कोड:


pw=java.io.PrintWriter(java.io.FileWriter('c:\\retail.txt')); 
line=num2str(0:size(data,2)-1); 
pw.println(line); 
for index=1:length(data) 
    disp(index); 
    line=num2str(full(data(index,:))); 
    pw.println(line); 
end 
pw.flush(); 
pw.close(); 

यहाँ data एक बहुत बड़े विरल मैट्रिक्स है।

+1

मैं उलझन में हूं - आपने MATLAB के अंतर्निहित फॉपेन और fprintf के बजाय java.io का उपयोग क्यों किया? – SCFrench

+0

शायद क्योंकि मैं matlab से बेहतर जावा जानता था, और यह एक फेंक कोड था, इसलिए इसे सुंदर होने की आवश्यकता नहीं थी। इसे बस सही तरीके से काम करने की आवश्यकता है :) – Midhat

2

क्या आपने इसे विभाजन करने का प्रयास किया था?

मेरा मतलब है कि 1000 पहली पंक्तियों (या 5000) पर पूर्ण() को कॉल करने का प्रयास करें और फिर यह काम करता है तो प्रक्रिया को दोहराएं।

+0

हाँ हमेशा एक विकल्प thats, यह शायद समय लेखन का एक बहुत ले जाएगा एएससीआई चंक्स और बाद में उन्हें विलय कर रहे हैं – Midhat

6

स्पैर मैट्रिक्स को .mat फ़ाइल के रूप में सहेजें। फिर, दूसरे प्रोग्राम में, .mat फ़ाइल पढ़ने के लिए उपयुक्त लाइब्रेरी का उपयोग करें।

उदाहरण के लिए, यदि अन्य प्रोग्राम पायथन में लिखा गया है, तो आप scipy.io.mio.loadmat फ़ंक्शन का उपयोग कर सकते हैं, जो स्पैस एरे का समर्थन करता है और आपको एक स्पैस numpy मैट्रिक्स देता है।

+1

अन्य प्रोग्राम रैपिमिनर – Midhat

0

यदि यह एक बार एक सौदा सौदा है, तो मैं सिर्फ मैट्रिक्स के माध्यम से पुनरावृत्ति करता हूं और ब्रूट फोर्स द्वारा एएससीआईआईआई फ़ाइल में मैट्रिक्स लिखता हूं, या अन्यथा @Veynom's सुझाव का उपयोग करें और पंक्तियों के उप-समूह पर पूर्ण() को कॉल करें । इसमें कुछ समय लग सकता है, लेकिन MATLAB पर्यावरण के बाहर .mat फ़ाइल में पढ़ने के तरीके को सीखने के लिए शायद यह तेज़ी से किया जा सकता है।

यदि ऐसा कुछ है जो आपको पुनरावर्ती आधार पर करने की ज़रूरत है, तो मैं @Vebjorn की सलाह लेता हूं और .mat फ़ाइल पढ़ने के लिए लाइब्रेरी का उपयोग करता हूं।

1

गैर शून्य तत्वों का सूचकांक पाने के लिए find समारोह का उपयोग करें ...

idcs = find(data); 
vals = data(idcs); 
...save the index vector and value vector in whatever format you want... 

आप चाहते हैं, तो आप ind2sub उपयोग कर सकते हैं, पंक्ति स्तंभ सबस्क्रिप्ट को रैखिक सूचकांक कन्वर्ट करने के लिए।

यदि आपको सबस्क्रिप्ट + मानों से मैटलैब में एक स्पैर मैट्रिक्स को फिर से बनाने की आवश्यकता है, तो spconvert का उपयोग करें।

26

आप सूचकांक & मूल्य वैक्टर पाने के लिए लगता है का उपयोग कर सकते हैं:

[i,j,val] = find(data) 
data_dump = [i,j,val] 

आप spconvert साथ data_dump है, जो "विरल मैट्रिक्स बाहरी प्रारूप से आयात करें" का मतलब है करने के लिए से डेटा पुन: कर सकते हैं (ताकि मुझे लगता है कि यह एक अच्छी बात है निर्यात प्रारूप):

save -ascii data.txt data_dump 
:

data = spconvert(data_dump) 

आप के साथ ASCII को बचा सकता है

लेकिन इस डबल के रूप में सूचकांक उदासीनता, आप इसे fopen के साथ और अधिक अच्छी तरह से बाहर लिख सकते हैं/fprintf/fclose:

fid = fopen('data.txt','w') 
fprintf(fid,'%d %d %f\n', transpose(data_dump)) 
fclose(fid) 

आशा इस मदद करता है।

+4

fprintf कमांड के दौरान data_dump को दस्तावेज़ों (http://www.mathworks.com/help/matlab/ref/fprintf.html) के अनुसार उपयोग करने से पहले स्थानांतरित किया जाना चाहिए। ऐसा इसलिए होता है क्योंकि डेटा कॉलम-ऑर्डर में लिखा जाता है। –

+1

मैंने सुधार @AlanCN में सुधार किया है। – Joel

1

dlmwrite - ASCII-सीमांकित फ़ाइल सिंटेक्स के लिए मैट्रिक्स लिखें

dlmwrite (फ़ाइल नाम, एम)

dlmwrite (फ़ाइल नाम, एम, 'डी')

dlmwrite (फ़ाइल नाम, एम , 'डी', आर, सी)

dlmwrite (फ़ाइल नाम, एम, 'attrib1', मान 1, 'attrib2', value2, ...)

dlmwrite (फ़ाइल नाम, एम, '-append')

dlmwrite (फ़ाइल नाम, एम, '-append', विशेषता-मूल्य सूची)

संबंधित मुद्दे