开发者

How can I merge this data in MATLAB?

In the sample text file below, if column 3 contains a 1 then the corresponding data of column 2 should be merged with the data of the previous row in column 2. For example, the 40 in row 2 should be added to the 10 in row 1, then row 2 should be set to 0 (as shown in the modified sample text file). The problem with my code below is that it only records changes in the current data time(i,1) but not the changes made for the previous data.

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;
    开发者_StackOverflow社区fprintf(fid,'%g\t %g\t %g\n',array);
end
fclose(fid)


The reason the current time value is written properly but the previous one isn't is because you have already written the previous one to the file on the previous loop iteration, so there is no way for you to change it. You need to remove the printing from within the loop and add it after you adjust all of the time values.

You can also take advantage of vectorization by using the FIND function instead of a for loop. You also only need one call to FPRINTF to output all the data. Try this:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜