2010-12-29 24 views
9

Necesito escribir datos en un archivo .txt en MATLAB. Sé cómo escribir cadenas (fprintf) o matrices (dlmwrite), pero necesito algo que pueda hacer las dos cosas. Voy a dar un ejemplo a continuación:¿Cómo puedo escribir cadenas y matrices en un archivo .txt en 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') 

Esto funciona bien, pero con un problema. La primera línea del archivo es:

This is the matrix: 23,46 

Que no es lo que quiero. Quiero ver:

This is the matrix: 
23 46 
56 67 

¿Cómo puedo solucionar esto? No puedo usar una solución for loop y printf ya que los datos son enormes y el tiempo es un problema.

Respuesta

24

Creo que todo lo que tiene que hacer para arreglar el problema es añadir un retorno de carro (\r) a su declaración FPRINTF y quitar la primera llamada 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'); 

Y la salida en el archivo parece este (con lengüetas entre los números):

This is the matrix: 
23 46 
56 67 


NOTA: Una breve explicación del rea ... hijo para necesitar el \r en la declaración FPRINTF es porque un terminador de línea de PC se compone de un retorno de carro seguido de un avance de línea, que es el que es utilizado por DLMWRITE cuando se especifica la opción 'newline','pc'. El \r es necesario para garantizar que la primera línea de la matriz aparece en una nueva línea al abrir el archivo de texto de salida en el Bloc de notas.

+0

Gracias gnovice! me has ayudado otra vez! – Maddy

+0

Tengo un Q relacionado: El código funciona correctamente en mi sistema. Pero cuando remito el escritorio a un servidor y establezco su ruta Matlab en mis directorios matlab locales, el mismo código falla al configurar el archivo. Todo el proyecto se ejecuta correctamente, pero el procedimiento de archivo está fallando. ¿Algún comentario? Gracias – Maddy

+0

@Maddy: ¿Cómo está fallando? ¿Qué error obtienes? – gnovice

2

Tiene dos llamadas dlmwrite(), la primera en una matriz vacía, y la segunda falta la opción 'delimitador'. ¿Qué sucede si lo agrega a la segunda llamada?

5

No necesita la llamada de matriz vacía. Prueba este código:

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

me encontré con una situación similar añadiendo una cabecera a un csv. Puede usar dlmwrite con -append para agregar una sola línea configurando su delimitador igual a '' como se muestra a continuación.

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', ',') 

Esto produce lo siguiente:

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