2011-08-10 12 views
7

Matlab फ़ाइल से निर्दिष्ट तत्वों में निर्दिष्ट संख्या में पढ़ने में विफल रहा है। मेरे पास एक साधारण प्रोग्राम है जिसे दो फाइलों में पढ़ने की जरूरत है, डेटा पर एक रैखिक ऑपरेशन करें और एक संयुक्त परिणाम को तीसरी फ़ाइल में लिखें।MATLAB बाइनरी फ़ाइलों में सफलतापूर्वक पढ़ने में विफल क्यों है?

मेरे प्रश्न हैं: 1) मैटलैब निर्दिष्ट तत्वों को पढ़ने में विफल क्यों रहता है और 2) क्या इसके लिए कोई कामकाज है? आपके विचारों में से कोई भी सहायक होगा।

इनपुट फ़ाइलों पर कुछ विवरण:

  • वे बड़े हैं (~ 18GB)
  • वे दोनों एक ही आकार के होते हैं (वास्तव में) प्रक्रिया पर

विवरण (2-4 feof पर दोनों फाइलों की जांच की गई है:

  1. पढ़ने और डब्ल्यू के लिए इनपुट और आउटपुट फ़ाइलों को खोलें riting (resp।) इनपुट में से प्रत्येक से N तैरता (एन * 4 बाइट्स) में
  2. पढ़ें फ़ाइलें
  3. डेटा (जैसे कि 0.5 * (datin1 + datin2)) पर कार्रवाई
  4. के परिणाम लिखें आउटपुट फाइल।

अनुमोदित, यह सब बहुत आसान है और ज्यादातर मामलों में इसने अच्छी तरह से काम किया है। दुर्भाग्य से, चक्र में कुछ बिंदु पर, MATLAB सभी N तैरता फ़ाइलों में से एक से नहीं मिलता है और कदम 3.

कोड कटाव पर एक मैट्रिक्स आयाम त्रुटि देता है:

N = 2048; 
fidin1 = fopen('file1.dat','r','l'); 
fidin2 = fopen('file2.dat','r','l'); 
fidout = fopen('outfile.dat','w','l'); 

%# I could do some assertions on the file sizes, 
%# but I know they are the same size (w/o question). 

while(~feof(fidin1) && ~feof(fidin2)) 
    datin1 = fread(fidin1,N,'float=>single',0,'l'); 
    datin2 = fread(fidin2,N,'float=>single',0,'l'); 

    %# the following line produces an error after 100 
    %# or more iterations in to the procedure 
    datout = 0.5*(datin1+datin2); 
    fwrite(fidout,datout,'float',0,'l'); 
end 

UPDATE 1 मैं प्राप्त कर रहा हूँ त्रुटि संदेश है:

???Error using ==> plus 
Matrix dimension must agree. 

अद्यतन 2 मैं एक सुझाव एक पीछा एनडी ferror प्रत्येक पढ़ने के बाद चेक और जादुई समस्या दूर हो गई। तो अब मेरे प्रश्नों में एक संशोधन: यहां समस्या की जड़ क्या हो सकती है? क्या यह बस एक समय मुद्दा या बग है?

यहां अपडेट किए गए कोड का एक स्निप है (कोड का केवल एक हिस्सा दिखा रहा है)। मुझे यकीन है कि ऐसा करने के बेहतर तरीके हैं। भले ही, इन चेकों के अतिरिक्त ने मैटलैब को प्रत्येक फाइल से सभी पाठों को सफलतापूर्वक पूरा करने की अनुमति दी।

[datin1 count1]= fread(fidin1,N,'float=>single',0,'l'); 
    [msg errn1]=ferror(fidin1); 
    if errn1 
     pos1 = ftell(fidin1); 
     error('Error at Position %d in file. %d bytes were read.',... 
      pos1,count1); 
    end 

    [datin2 count2]= fread(fidin2,N,'float=>single',0,'l'); 
    [msg errn2]=ferror(fidin2); 
    if errn2 
     pos2 = ftell(fidin2); 
     error('Error at Position %d in file. %d bytes were read.',... 
      pos2,count2); 
    end 

    %# the following line produces an error after 100 
    %# or more iterations in to the procedure 
    datout = 0.5*(datin1+datin2); 
    fwrite(fidout,datout,'float',0,'l'); 
+1

क्या आप सही त्रुटि संदेश प्राप्त कर रहे हैं? –

+0

दोनों आंतरिक हार्ड डिस्क पर फाइलें हैं? और आप किस ओएस पर हैं? 32 या 64 बिट matlab? –

+0

@ एंड्रयू, '==> प्लस का उपयोग करने में त्रुटि ...मैट्रिक्स आयामों को सहमत होना चाहिए '। – ephsmith

उत्तर

1

क्या आपने विशेष रूप से त्रुटि होने पर datin1 और datin2 चर को देखा है? 'डीबग -> त्रुटियों/चेतावनियों को रोकें ...' पर जाने का प्रयास करें, फिर 'अगर त्रुटि हो तो रोकें (अगर त्रुटि हो तो डस्टॉप करें)'। अपना प्रोग्राम चलाएं और फिर क्रैश होने के बाद, डेटिन 1 और डेटिन 2 देखें। उम्मीद है कि यह समझाएगा कि उन्हें एक साथ क्यों जोड़ना अब काम कर रहा है।

+0

यह मेरे लिए नया है। इस दृष्टिकोण को इंगित करने के लिए धन्यवाद। जैसा कि यह पता चला है, त्रुटि बड़ी फ़ाइलों के साथ intermittent है। शायद यह दृष्टिकोण मुझे समझने में मदद करेगा क्यों। मेरा वर्तमान समाधान फ़ाइल-सेगमेंट लिखना है जो बहुत छोटे हैं। चूंकि मैंने यह परिवर्तन किया है, इसलिए कोई त्रुटि नहीं हुई है, जो मुझे विश्वास दिलाती है कि यह फ़ाइल आकार की समस्या है। – ephsmith

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

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