2010-12-29 3 views
9

J'ai besoin d'écrire des données dans un fichier .txt dans MATLAB. Je sais comment écrire des chaînes (fprintf) ou matrices (dlmwrite), mais j'ai besoin de quelque chose qui peut faire les deux. Je vais donner un exemple ci-dessous:Comment écrire des chaînes et des matrices dans un fichier .txt dans 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') 

Cela fonctionne bien, mais avec un problème. La première ligne du fichier est:

This is the matrix: 23,46 

Ce qui n'est pas ce que je veux. Je veux voir:

This is the matrix: 
23 46 
56 67 

Comment puis-je résoudre ce problème? Je ne peux pas utiliser une solution for loop et printf car les données sont énormes et le temps est un problème.

Répondre

24

Je pense que tout ce que vous devez faire pour résoudre votre problème est d'ajouter un retour chariot (\r) à votre déclaration FPRINTF et supprimer le premier appel à 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'); 

Et la sortie dans le fichier ressemble ce (avec des onglets entre les numéros):

This is the matrix: 
23 46 
56 67 


REMARQUE: Une brève explication ... rea fils pour avoir besoin du \r dans l'instruction FPRINTF est parce qu'un terminateur de ligne PC est composé d'un retour chariot suivi d'un saut de ligne, qui est ce qui est utilisé par DLMWRITE lorsque l'option 'newline','pc' est spécifiée. Le \r est nécessaire pour s'assurer que la première ligne de la matrice apparaît sur une nouvelle ligne lors de l'ouverture du fichier texte de sortie dans le Bloc-notes.

+0

Merci gnovice! tu m'as encore aidé! – Maddy

+0

J'ai un connexe Q: Le code fonctionne correctement sur mon système. Mais lorsque je place le bureau à distance sur un serveur et que je place son chemin Matlab dans mes répertoires matlab locaux, le même code ne parvient pas à configurer le fichier. L'ensemble des projets s'exécute correctement, mais la procédure de fichier échoue. Des commentaires? Merci – Maddy

+0

@Maddy: Comment ça marche? Quelle erreur obtenez-vous? – gnovice

2

Vous avez deux appels dlmwrite(), le premier sur une matrice vide, et le second manque l'option 'delimiter'. Que se passe-t-il si vous l'ajoutez au second appel?

5

Vous n'avez pas besoin de l'appel de matrice vide. Essayez ce code:

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

J'ai rencontré une situation similaire en ajoutant un en-tête à un csv. Vous pouvez utiliser dlmwrite avec -append pour ajouter une seule ligne en définissant votre délimiteur égal à '' comme indiqué ci-dessous.

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

Ce produit les éléments suivants:

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