2010-06-18 3 views
1

Dans l'exemple de fichier texte ci-dessous, si la colonne 3 contient un 1, les données correspondantes de la colonne 2 doivent être fusionnées avec les données de la ligne précédente dans la colonne 2. Par exemple, 40 dans la ligne 2 doit être ajouté au 10 dans la ligne 1, la ligne 2 doit être définie sur 0 (comme indiqué dans le fichier texte modifié). Le problème avec mon code ci-dessous est qu'il enregistre uniquement les changements dans les données actuelles time(i,1) mais pas les modifications apportées pour les données précédentes.Comment puis-je fusionner ces données dans MATLAB?

original.txt  
    a time c 
    1 10 0 
    2 40 1 
    3 20 0 
    4 11 0 
    5 40 1 

modified.txt  
    a time c 
    1 50 0 
    2 0 0 
    3 20 0 
    4 51 0 
    5 0 0 




fid=fopen('data.txt'); 
A=textscan(fid,'%f%f%f'); 

a =A{1}; 
time=A{2}; 
c =A{3}; 

fclose(fid); 

fid=fopen('newData.txt','wt'); 

for i=1:size(a) 
    if c(i,1)==1 
    time(i-1,1)=time(i,1)+time(i-1,1); % merge the time of the current and the previous 
    time(i,1) =0; %set the time to 0 

    array = []; %empty the array 
    array = [a(i,1) time c(i,1)]; add new data 
    format short g; 
    fprintf(fid,'%g\t %g\t %g\n',array); 
end 
fclose(fid) 

Répondre

0

La raison pour laquelle la valeur time actuelle est écrit correctement, mais le précédent n'est pas parce que vous avez déjà écrit le précédent du fichier sur la boucle précédente itération, donc il n'y a aucun moyen pour vous pour le changer. Vous devez supprimer l'impression de la boucle et l'ajouter après avoir ajusté toutes les valeurs time.

Vous pouvez également tirer parti de la vectorisation en utilisant la fonction FIND au lieu d'une boucle for. Vous avez également besoin d'un seul appel au FPRINTF pour afficher toutes les données. Essayez ceci:

a = [1; 2; 3; 4; 5];   %# Sample data 
time = [10; 40; 20; 11; 40]; %# Sample data 
c = [0; 1; 0; 0; 1];   %# Sample data 

index = find(c == 1);    %# Find indices where c equals 1 
temp = time(index);     %# Temporarily store the time values 
time(index) = 0;      %# Zero-out the time points 
time(index-1) = time(index-1)+temp; %# Add to the previous time points 
c(index) = 0;      %# Zero-out the entries of c 

fid = fopen('newData.txt','wt');    %# Open the file 
fprintf(fid,'%g\t %g\t %g\n',[a time c].'); %'# Write the data to the file 
fclose(fid);         %# Close the file 
+0

Merci gnovice..if J'ai des milliers de lignes est-il possible d'utiliser le vecteur? – Jessy

+0

@Jessy: Le code ci-dessus devrait gérer les vecteurs avec des milliers d'éléments sans aucun problème. Un avertissement, cependant: si 'c' a les uns à côté des autres, vous pouvez obtenir des résultats inattendus. Par exemple, 'time = [20; dix; 10]; 'et' c = [0; 1; 1]; 'vous donnera un résultat de' time = [30; 0; 0]; ', pas' time = [30; dix; 0]; Est-ce que ça va être OK? – gnovice

+0

@gnovice: Merci. Mais j'ai vraiment besoin du temps = [30; 10; 0] :( – Jessy

Questions connexes