如何在MATLAB中合并这些数据?

时间:2010-06-18 16:46:32

标签: matlab merge

在下面的示例文本文件中,如果第3列包含1,则第2列的相应数据应与第2列中上一行的数据合并。例如,40第2行应添加到第1行的10,然后第2行应设置为0(如修改后的示例文本文件所示)。我的代码下面的问题是它只记录当前数据time(i,1)的变化,而不记录以前数据的变化。

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)

1 个答案:

答案 0 :(得分:0)

当前time值正确写入但前一个值不正确的原因是因为您已经已经将已经写入前一个循环迭代中的文件你无法改变它。您需要从循环中删除打印,并在调整所有time值后添加它。

您还可以使用FIND函数而不是for循环来利用矢量化。您还只需要拨打FPRINTF一次即可输出所有数据。试试这个:

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