2010-07-03 11 views
1

QUESTION ÉDITÉ:Comment convertir les variables Matlab .dat (texte) fichier avec les en-têtes

J'ai 2500 lignes x 100 colonnes données dans la variable nommée avg_data_models. J'ai aussi 2500 lignes x 100 colonnes variables 'X' et une variable matricielle de taille similaire 'Y', les deux contenant les coordonnées. Je veux enregistrer les valeurs de cette variable dans un fichier texte (.dat) qui doit avoir 302 lignes d'en-tête de la manière suivante:

avg_data_models 
300 
X_1 
X_2 
. 
. 
. 
X_100 
Y_1 
Y_2 
. 
. 
. 
Y_100 
avg_data_models_1 
avg_data_models_2 
avg_data_models_3 
. 
. 
. 
. 
. 
avg_data_models_100 

Dans le style d'en-tête ci-dessus, la première ligne est le nom du fichier , la deuxième ligne indique le nombre de colonnes (chaque colonne a 2500 lignes), et le reste des 300 lignes représente le modèle de chaque variable respectivement - Comme 100 modèles de X, 100 modèles de Y et 100 modèles de modèles avg_data_models.

Répondre

2

Tenir compte de ce code:

%# here you have your data X/Y/.. 
%#X = rand(2500,100); 

[r c] = size(X); 
prefixX = 'X'; 
prefixY = 'Y'; 
prefixData = 'avg_data_models'; 

%# build a cell array that contains all the header lines 
num = strtrim(cellstr(num2str((1:c)','_%d'))); %#' SO fix 
headers = [ prefixData ; 
      num2str(3*c) ; 
      strcat(prefixX,num) ; 
      strcat(prefixY,num) ; 
      strcat(prefixData,num) ]; 

%# write to file 
fid = fopen('outputFile.dat', 'wt'); 
fprintf(fid, '%s\n',headers{:}); 
fclose(fid); 

EDIT

Il semble que je mal compris la question .. Voici le code pour écrire le réel données (pas les titres d'en-tête!):

%# here you have your data X/Y/.. 
avg_data_models = rand(2500,100); 
X = rand(2500,100); 
Y = rand(2500,100); 

%# create file, and write the title and number of columns 
fid = fopen('outputFile.dat', 'wt'); 
fprintf(fid, '%s\n%d\n', 'avg_data_models', 3*size(X,2)); 
fclose(fid); 

%# append rest of data 
dlmwrite('outputFile.dat', [X Y avg_data_models], '-append', 'delimiter',',') 

Note: J'ai utilisé une virgule , comme séparateur, vous pouvez le changer pour un espace ou un onglet \t si vous aimez ..

+0

@Harpreet: mise à jour du code, maintenant écrire les valeurs de données au lieu du nom des en-têtes .. – Amro

+0

@Harpreet: bien sûr. Vous pouvez toujours voir toutes les révisions précédentes des réponses sur SO en cliquant sur le lien "" édité – Amro

+0

@Harpreet: exactement ce que cela fait, notez que [x '; y'; z '] 'est équivalent à' [xyz ] '' – Amro

1

Vous pouvez utiliser fprintf pour écrire l'en-tête, comme ceci:

%# define the number of data 
nModels = 100; 
dataName = 'avg_data_models'; 

%# open the file 
fid = fopen('output.dat','w'); 

%# start writing. First line: title 
fprintf(fid,'%s\n',dataName); %# don't forget \n for newline. Use \n\r if yow want to open this in notepad 

%# write number of models 
fprintf(fid,'%i\n',nModels) 

%# loop to write the rest of the header 
for iModel = 1:nModels 
fprintf(fid,'%s_%i\n',dataName,iModel); 
end 

%# use your favorite method to write the rest of the data. 
%# for example, you could use fprintf again, using /t to add tabs 
%# create format-string 
%# check the help to fprintf to learn about formatting details 
formatString = repmat('%f\t',1,100); 
formatString = [formatString(1:end-1),'n']; %# replace last tab with newline 

%# transpose the array, because fprintf reshapes the array to a vector and 
%# 'fills' the format-strings sequentially until it runs out of data 
fprintf(fid,formatString,avg_data'); %'# SO formatting 

%# close the file 
fclose(fid); 
+0

@Harpreet: Désolé pour les erreurs dans 'fopen' et' repmat'. Je mets '/ t' au lieu de' \ t', ce qui signifie que si vous remplacez la dernière lettre 't' par' n', il n'y aurait pas de nouvelle ligne ('\ n'). J'ai corrigé les problèmes. En outre, je pensais que vos données étaient 100x2500, alors je pensais que vous voudriez avoir 100 lignes avec 2500 colonnes. J'ai aussi changé cela. – Jonas

+0

@Harpreet: J'ai fait un changement de formatage. Merci pour l'information! – Jonas