2013-02-22 80 views
5

मैं सी ++ में कुछ बाहरी कॉल का आह्वान करने के लिए मैटलैब का उपयोग कर रहा हूं और फिर एक विशाल गणना की गई मैट्रिक्स को वापस प्राप्त करता हूं। मैट्रिक्स बहुत बड़ा है, और मेरे पास इस सी ++ प्रोग्राम के स्रोत कोड तक पहुंच नहीं है। (यदि मेरे पास है, तो मैं इसे सी ++ से तुरंत सहेज दूंगा)Matlab matrices को बचाने के लिए सबसे तेज़ तरीका

अभी, मेरे सिस्टम पर, यह सी ++ प्रोग्राम केवल दिए गए डेटा की गणना करने के लिए 1 सेकंड का उपयोग करता है और मैटलैब पर वापस भेजता है, और मैटलैब की डीएलएमराइट 200- डिस्क पर इस एकल विशाल सरणी को बचाने के लिए 300 सेकंड। मेरे पास गणना करने के लिए कुछ और हजार हैं, और मैं समय कम करना चाहता हूं।

तो मैटलैब में सहेजने का सबसे तेज़ तरीका क्या है?

+0

सहेजे गए डेटा के साथ आप क्या करना चाहते हैं? उन्हें Excel में पढ़ें? केवल MATLAB में उनका उपयोग करें? –

+0

इस संसाधित डेटा का उपयोग कई अन्य कार्यक्रमों द्वारा कहीं और किया जाएगा। – Karl

+0

यह बहुत उपयोगी नहीं है। आप अन्य प्रोग्राम को किस इनपुट प्रारूप को स्वीकार कर सकते हैं? –

उत्तर

5

शायद सबसे तेज़ तरीका संभवतः मैटलैब का save कमांड है। वैकल्पिक रूप से, आप fwrite पूरे मैट्रिक्स को बाइनरी फ़ाइल में कर सकते हैं।

dlmwrite का उपयोग करके मानों को टेक्स्ट में परिवर्तित किया जाता है, जिसमें समय लगता है और डिस्क पर लिखने के लिए अधिक डेटा होता है। ऐसा तब तक न करें जब तक कि आपको वास्तव में उस प्रारूप में डेटा रखने की आवश्यकता न हो। ध्यान दें कि dlmwrite तेज होगा यदि एक लूप के बजाय एक बड़े मैट्रिक्स के साथ एक बार बुलाया जाता है जो आपकी फ़ाइल को तेज़ी से लिखता है।

+0

मैंने 'ए = शून्य (10000) का परीक्षण किया है; dlmwrite (...) बचाते समय 89.5 सेकेंड लेता है (...) 2.68 सेकंड लेता है 'अब, यह प्रभावशाली है। – Karl

+0

लेकिन दुर्भाग्यवश, अगर मैं सहेजने वाले फ़ंक्शन से मैट फ़ाइलों का उपयोग करने जा रहा हूं, तो मुझे मैट फाइल पढ़ने में खोदना होगा। – Karl

+0

@ करल रीडिंग .mat फाइल आपके डेटा के आधार पर जटिल हो सकती है। 'fwrite' शायद' सेव 'जितना तेज़ है, लेकिन फिर आपको अपने कस्टम बाइनरी प्रारूप पर फैसला करना होगा और इसे लिखने और पढ़ने में सक्षम होना चाहिए। – shoelzer

2

यदि आप केवल मैटलैब समाधान चाहते हैं, तो शायद मैं ASCII के लिए बाइनरी या fprintf के लिए fwrite का उपयोग करूंगा। हालांकि, जब मैं आईओ की बात करता हूं तो मैटलैब और जावा को मिश्रित करना पसंद करता हूं क्योंकि यह आमतौर पर तेज़ होता है। मैं

Java Code 
package mypackage.release; 

import java.io.DataOutputStream; 
import java.io.BufferedOutputStream; 
import java.io.FileOutputStream; 
import java.io.IOException 


public class MatrixWriter { 
    public static void write(String fileName, double[] matrix) throws IOException { 
    DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fileName))); 
    for (double d : matrix) 
     dos.writeDouble(d); 
    dos.close(); 
    } 
} 

Matlab Code 
import mypackage.release.MatrixWriter; 
M = get matrix from c++; 
MatrixWriter.write('myfile.dat', M(:)); 

यह मेरे सिर के शीर्ष से कुछ है, लेकिन मैं हर समय इस बदलाव का उपयोग करता हूं। आशा करता हूँ की ये काम करेगा।

+0

क्या आप कम से कम अपने कोड VS dlmwrite का कुछ परिणाम दिखा सकते हैं? – Karl

+1

सुनिश्चित करें। एम = शून्य (1000); टिक; dlmwrite ('temp.dat', एम); toc; विलुप्त समय 2.2 9 6 9 42 सेकंड टिक है; MatrixWriter.write ('temp.dat', एम (:)); टीओसी विलुप्त समय 0.252032 सेकेंड – PaxRomana99

+0

फ़ैई है, इसकी तुलना फ़ेराइट से की गई है, और यह इस मामले में तेज़ है। जब तक आप कुछ और जटिल नहीं कर रहे हैं जो जाने का सबसे अच्छा तरीका हो सकता है। – PaxRomana99