2012-10-17 8 views
10

Ho una matrice grande (2e6 x 3) che devo scrivere in un file di testo.Qual è il modo più veloce per scrivere una matrice in un file di testo in Octave?

dlmwrite richiede circa 230 anni per raggiungere questo obiettivo.

Dalla tua esperienza qual è il modo più veloce per scrivere una matrice di grandi dimensioni in un file di testo?

+1

Hai provato l'opzione '-ascii' di' save'. Cioè, 'save -ascii output.txt variableName' – petrichor

+0

Hai bisogno di salvare solo i dati o ha bisogno di essere formattato in un file di testo? L'idea di @ petrichor dovrebbe funzionare bene. – twerdster

risposta

13

Quanto segue si applica a MATLAB, ma suggerisco di provarlo in Octave. Prima di tutto, se puoi, trasponi la matrice. Ecco alcuni esempi che utilizzano fprintf e csvwrite (essenzialmente 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. 

Se non recepita, ci vorrà davvero età. By default, fprintf flushes the buffer after every call. Puoi provare a usare W invece di w per aprire il file, ma non migliora troppo la situazione.

+0

FYI Ho provato csvwrite in Octave e funziona perfettamente. –

+2

È possibile evitare il ciclo esplicito e utilizzare un 'fprintf (fid, '% f% f% f \ n', A)' Inoltre, fprintf ricicla il formato applicato alle variabili in base alla colonna. E.g: 'tic; fid = fopen ('data.txt', 'w +'); fprintf (fid, 'a =% f b =% f c =% f \ n', A); fclose (fid); toc' Il tempo trascorso è 2.019833 secondi. e dà tre numeri e una nuova riga su ciascuna delle linee 1e6. –

0

Teoricamente, secondo quanto @angainor dice, si può anche migliorare le prestazioni involucro in qualche modo

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

in blocchi per evitare inutili buffer di vampate di calore, 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. 

dovrebbe cercare ..

7

Hai provato questo? Non sono sicuro della sua velocità rispetto a dlmwrite.

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

forse dovrebbe essere usato in questo modo: tic; salva temp.txt A -ASCII; toc; – Kupto

1

Avere una variabile data è possibile salvare in un formato text con valori di spazio separate (compreso un'intestazione):

save out.txt data 

L'intestazione può essere rimosso semplicemente utilizzando comando di base Unix tail esempio (Su qualsiasi Linux/Mac OS):

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

Utilizzare questo in Matlab:

save -ascii output.txt variableName 

Utilizzare questo in Octave:

save hello1.m variableName -ascii 
Problemi correlati