2012-10-17 10 views
10

Ich habe eine große Matrix (2e6 x 3), die ich in eine Textdatei schreiben muss.Was ist der schnellste Weg, um eine Matrix in eine Textdatei in Octave zu schreiben?

dlmwrite benötigt ca. 230s, um diese Aufgabe zu erfüllen.

Aus Ihrer Erfahrung, was ist der schnellste Weg, um eine große Matrix in eine Textdatei zu schreiben?

+1

Haben Sie versucht, die '-ascii' Option' speichern ". Das heißt, 'save -ascii output.txt variableName' – petrichor

+0

Müssen Sie nur die Daten speichern oder müssen sie in einer Textdatei formatiert werden? @ Petrichors Idee sollte gut funktionieren. – twerdster

Antwort

13

Folgendes gilt für MATLAB, aber ich schlage vor, dass Sie es in Octave versuchen. Zuallererst, wenn Sie können - die Matrix transponieren. Hier sind einige Beispiele mit fprintf und csvwrite (im Wesentlichen dlmwrite)

A = rand(3, 1e6); 
tic; 
fid = fopen('data.txt', 'w+'); 
for i=1:size(A, 1) 
    fprintf(fid, '%f ', A(i,:)); 
    fprintf(fid, '\n'); 
end 
fclose(fid); 
toc 

tic; 
csvwrite('data.txt', A); 
toc; 

Elapsed time is 1.311512 seconds. 
Elapsed time is 2.487737 seconds. 

Wenn nicht umgesetzt, es altert tatsächlich stattfinden wird. By default, fprintf flushes the buffer after every call. Sie können versuchen, W anstelle von w zu verwenden, um die Datei zu öffnen, aber es verbessert die Situation hier nicht zu sehr.

+0

FYI Ich versuchte csvwrite in Octave und es funktioniert gut. –

+2

Sie können die explizite Schleife vermeiden und ein 'fprintf (fid, '% f% f% f \ n', A) 'verwenden. Außerdem wird fprintf das auf die Variablen angewendete Format spaltenweise wiederverwenden. ZB: 'tic; fid = fopen ('data.txt', 'w +'); fprintf (fid, a =% fb =% fc =% f \ n ', A); fclose (fid); toc' Die verstrichene Zeit ist 2.019833 Sekunden. und gibt drei Zahlen und eine neue Zeile auf jeder der 1e6 Zeilen. –

0

Theoretisch nach dem, was @angainor sagt, kann man sogar die Leistung verbessern Verpackung irgendwie

for i=1:size(A, 1) 
    fprintf(fid, '%f ', A(i,:)); 
    fprintf(fid, '\n'); 
end 

in Stücke nutzlos Pufferspülung zu vermeiden, iedoing

1. coverting (in memory) numbers->string + introduction of termination characters '\n' 
    (for say K matrix rows) 
2. writing of the obtained string to file through fscanf. 

versuchen Sollens ..

7

Haben Sie das versucht? Ich bin mir nicht sicher über die Geschwindigkeit im Vergleich zu dlmwrite.

a = [1 2;3 4]; 
save temp.txt a; 
+2

vielleicht sollte es auf diese Weise verwendet werden: Tic; temp.txt speichern A -ASCII; Toc; – Kupto

1

mit einer variablen data Sie es in einem text Format mit Leerzeichen getrennt Werte speichern können (einschließlich Header):

save out.txt data 

Der Header kann einfach mit grundlegenden Unix-Befehl entfernt werden tail z.B. (Auf jedem Linux/Mac OS):

tail -n +6 out.txt > file.csv 
0

verwenden in Matlab:

save -ascii output.txt variableName 

verwenden in Octave:

save hello1.m variableName -ascii