2013-02-22 5 views
5

Ich benutze Matlab, um einige externe Aufrufe in C++ aufzurufen und dann eine riesige berechnete Matrix zurück zu erhalten. Die Matrix ist sehr groß und ich habe keinen Zugriff auf den Quellcode dieses C++ Programms. (Wenn ich es getan habe, werde ich es sofort von C++ speichern lassen)Der schnellste Weg zum Speichern von Matlab-Matrizen

Momentan verwendet dieses C++ Programm auf meinem System nur 1 Sekunde, um die gegebenen Daten zu berechnen und zurück an Matlab zu senden, und Matlabs dlmwrite benötigt 200- 300 Sekunden, um dieses einzelne große Array auf der Festplatte zu speichern. Ich habe noch ein paar Tausend zu berechnen, und ich möchte die Zeit verkürzen.

Was ist der schnellste Weg, um in Matlab zu speichern?

+0

Was möchten Sie mit den gespeicherten Daten tun? Lesen Sie sie in Excel? Nur in MATLAB verwenden? –

+0

Diese verarbeiteten Daten werden an anderer Stelle von mehreren anderen Programmen verwendet. – Karl

+0

Das ist nicht sehr hilfreich. Welches Eingabeformat können Sie den anderen Programmen zuweisen? –

Antwort

5

Der schnellste Weg ist wahrscheinlich Matlabs save Befehl. Alternativ könnten Sie die gesamte Matrix zu einer Binärdatei fwrite.

Mit dlmwrite werden die Werte in Text konvertiert, was Zeit kostet und mehr Daten auf die Festplatte schreibt. Tun Sie das nicht, es sei denn, Sie müssen die Daten wirklich in diesem Format haben. Beachten Sie, dass dlmwrite schneller ist, wenn Sie einmal mit einer großen Matrix statt in einer Schleife aufgerufen werden, die Ihre Datei inkrementell schreibt.

+0

Ich habe 'a = Nullen (10000) getestet; dlmwrite (...) benötigt 89,5 sec, während save (...) 2,68 sec dauert. Das ist beeindruckend. – Karl

+0

Aber leider, wenn ich Mat-Dateien von der Speicherfunktion verwenden werde, muss ich in Lesematten-Dateien graben. – Karl

+0

@Karl Das Lesen von .mat-Dateien kann abhängig von Ihren Daten komplex sein. 'fwrite' ist wahrscheinlich so schnell wie' save', aber dann müssen Sie sich für Ihr eigenes binäres Format entscheiden und in der Lage sein, es zu schreiben und zu lesen. – shoelzer

2

Wenn Sie nur eine Matlab-Lösung möchten, würde ich wahrscheinlich fwrite für binäre oder fprintf für ASCII verwenden. Allerdings mag ich Matlab und Java, wenn es um IO geht, da dies normalerweise schneller ist. Ich würde so etwas wie

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(:)); 

tun Dies ist etwas aus der Spitze von meinem Kopf, aber ich benutze Variationen dieses die ganze Zeit. Ich hoffe es hilft.

+0

Könnten Sie bitte etwas Ergebnis Ihres Codes VS mindestens dlmwrite zeigen? – Karl

+1

sicher. m = Nullen (1000); tic; dlmwrite ('temp.dat', m); Toc; Verstrichene Zeit ist 2.296942 Sekunden Tic; MatrixWriter.write ('temp.dat', m (:)); toc Verstrichene Zeit ist 0.252032 Sekunden – PaxRomana99

+0

fyi, nur verglichen es mit fwrite, und es ist schneller in diesem Fall. Es sei denn, Sie tun etwas Komplexeres, das der beste Weg sein könnte. – PaxRomana99

Verwandte Themen