2010-12-29 5 views
9

Ho bisogno di scrivere dati in un file .txt in MATLAB. So come scrivere stringhe (fprintf) o matrici (dlmwrite), ma ho bisogno di qualcosa che possa fare entrambe le cose. Fornirò un esempio qui sotto:Come posso scrivere stringhe e matrici in un file .txt in MATLAB?

str = 'This is the matrix: ' ; 
mat1 = [23 46 ; 56 67] ; 
%fName 
if *fid is valid* 
    fprintf(fid, '%s\n', str) 
    fclose(fid) 
end 
dlmwrite(fName, *emptymatrix*, '-append', 'delimiter', '\t', 'newline','pc') 
dlmwrite(fName, mat1, '-append', 'newline', 'pc') 

Questo funziona, ma con un problema. La prima riga del file è:

This is the matrix: 23,46 

Quale non è quello che voglio. Voglio vedere:

This is the matrix: 
23 46 
56 67 

Come posso risolvere questo? Non riesco a utilizzare un ciclo for e la soluzione printf poiché i dati sono enormi e il tempo è un problema.

risposta

24

Penso che tutto quello che dovete fare per risolvere il problema è aggiungere un ritorno a capo (\r) al vostro FPRINTF dichiarazione e rimuovere la prima chiamata a DLMWRITE:

str = 'This is the matrix: ';  %# A string 
mat1 = [23 46; 56 67];    %# A 2-by-2 matrix 
fName = 'str_and_mat.txt';   %# A file name 
fid = fopen(fName,'w');   %# Open the file 
if fid ~= -1 
    fprintf(fid,'%s\r\n',str);  %# Print the string 
    fclose(fid);      %# Close the file 
end 
dlmwrite(fName,mat1,'-append',... %# Print the matrix 
     'delimiter','\t',... 
     'newline','pc'); 

E l'uscita nel file sembra questo (con le schede tra i numeri):

This is the matrix: 
23 46 
56 67 


NOTA: una breve spiegazione ... la rea figlio per aver bisogno del \r nell'istruzione FPRINTF è perché un terminatore di riga PC è composto da un ritorno a capo seguito da un avanzamento riga, che è ciò che viene utilizzato da DLMWRITE quando viene specificata l'opzione 'newline','pc'. Il \r è necessario per garantire che la prima riga della matrice appaia su una nuova riga quando si apre il file di testo di output in Blocco note.

+0

Grazie gnovice! mi hai aiutato di nuovo! – Maddy

+0

Ho un Q correlato: Il codice funziona correttamente sul mio sistema. Ma quando eseguo il desktop remoto su un server e imposto il suo percorso Matlab sulle mie directory matlab locali, lo stesso codice non riesce a impostare il file. L'intero progetto viene eseguito correttamente, ma la procedura del file non funziona. Qualche commento? Grazie – Maddy

+0

@Maddy: come va? Che errore ottieni? – gnovice

2

Hai due chiamate dlmwrite(), la prima su una matrice vuota e la seconda manca l'opzione "delimitatore". Cosa succede se lo aggiungi alla seconda chiamata?

5

Non è necessaria la chiamata a matrice vuota. Prova questo codice:

str = 'This is the matrix: ' ; 
mat1 = [23 46 ; 56 67] ; 
fName = 'output.txt'; 
fid = fopen('output.txt','w'); 
if fid>=0 
    fprintf(fid, '%s\n', str) 
    fclose(fid) 
end 
dlmwrite(fName, mat1, '-append', 'newline', 'pc', 'delimiter','\t'); 
1

Mi sono imbattuto in una situazione simile aggiungendo un'intestazione a un csv. È possibile utilizzare dlmwrite con -append per aggiungere una singola riga impostando il delimitatore uguale a '' come mostrato di seguito.

str = 'This is the matrix: ';  %# A string 
mat1 = [23 46; 56 67];    %# A 2-by-2 matrix 
fName = 'str_and_mat.txt';   %# A file name 
header1 = 'A, B' 
dlmwrite(fName, str, 'delimiter', '') 
dlmwrite(fName, header1, '-append', 'delimiter', '') 
dlmwrite(fName, mat1, '-append','delimiter', ',') 

Questo produce il seguente:

This is the matrix: 
A, B 
23,46 
56,67