如何在MATLAB中执行这个累加和?

问题描述:

我要计算的值的累加值中的dat.txt低于那些每串2列第1列的期望的输出被示为dat2.txt如何在MATLAB中执行这个累加和?

dat.txt dat2.txt 
1 20  1 20 20 % 20 + 0 
1 22  1 22 42 % 20 + 22 
1 20  1 20 62 % 42 + 20 
0 11  0 11 11 
0 12  0 12 12 
1 99  1 99 99 % 99 + 0 
1 20  1 20 119 % 20 + 99 
1 50  1 50 169 % 50 + 119 

这是我的初始的尝试:

fid=fopen('dat.txt'); 
A =textscan(fid,'%f%f'); 
in =cell2mat(A); 
fclose(fid); 

i = find(in(2:end,1) == 1 & in(1:end-1,1)==1)+1; 
out = in; 
cumulative =in; 
cumulative(i,2)=cumulative (i-1,2)+ cumulative(i,2); 

fid = fopen('dat2.txt','wt'); 
format short g; 
fprintf(fid,'%g\t%g\t%g\n',[out cumulative(:)]'); 
fclose(fid); 

这里是一个完全矢量(虽然有点混乱的前瞻性),其使用功能CUMSUMlogical indexing一起DIFF产生你想要的结果的解决方案:

>> data = [1 20;... %# Initial data 
      1 22;... 
      1 20;... 
      0 11;... 
      0 12;... 
      1 99;... 
      1 20;... 
      1 50]; 
>> data(:,3) = cumsum(data(:,2));  %# Add a third column containing the 
             %# cumulative sum of column 2 
>> index = (diff([0; data(:,1)]) > 0); %# Find a logical index showing where 
             %# continuous groups of ones start 
>> offset = cumsum(index.*(data(:,3)-data(:,2))); %# An adjustment required to 
                %# zero the cumulative sum 
                %# at the start of a group 
                %# of ones 
>> data(:,3) = data(:,3)-offset;  %# Apply the offset adjustment 
>> index = (data(:,1) == 0);   %# Find a logical index showing where 
             %# the first column is zero 
>> data(index,3) = data(index,2)  %# For each zero in column 1 set the 
             %# value in column 3 to be equal to 
data =         %# the value in column 2 

    1 20 20 
    1 22 42 
    1 20 62 
    0 11 11 
    0 12 12 
    1 99 99 
    1 20 119 
    1 50 169 
+0

非常好的主意! +1 – yuk 2010-06-23 18:49:20

+0

我不知道函数DIFF是否仅适用于测试一个条件?如果我想找到满足两个条件的累积和,那么如何在不使用函数FIND的情况下做到这一点? – Jessy 2010-07-08 07:34:32

d=[ 
1 20  
1 22  
1 20  
0 11  
0 12  
1 99  
1 20  
1 50 
]; 
disp(d) 

out=d; 
%add a column 
out(:,3)=0; 

csum=0; 
for(ind=1:length(d(:,2))) 
    if(d(ind,1)==0) 
     csum=0;   
     out(ind,3)=d(ind,2);  
    else 
     csum=csum+d(ind,2); 
     out(ind,3)=csum;  
    end 

end 

disp(out) 
+0

哈希蓝色@是它可能只是使用FIND函数而不使用LOOP? – Jessy 2010-06-23 14:49:22

不是完全矢量化的解决方案(它循环遍历顺序1的段),但应该更快。它只为您的数据执行2个循环。使用MATLAB的CUMSUM函数。

istart = find(diff([0; d(:,1)])==1); %# start indices of sequential 1s 
iend = find(diff([d(:,1); 0])==-1); %# end indices of sequential 1s 

dcum = d(:,2); 
for ind = 1:numel(istart) 
    dcum(istart(ind):iend(ind)) = cumsum(dcum(istart(ind):iend(ind))); 
end 

dlmwrite('dat2.txt',[d dcum],'\t') %# write the tab-delimited file 
+0

通过图像处理工具箱,您可以使用'bwlabel'查找连接的组1' – Jonas 2010-06-23 18:18:36

+0

@Jonas:我记得你从另一个问题的答案中得到了答案。这里没有IPT进行测试。无论如何,我的代码非常简单。面临的挑战是如何在没有for-loop的情况下为所有组做cumsum。如果我们在单元阵列中有完整的组,我们可以使用CELLFUN。我会很高兴看到一个使用bwlabel的例子,因为我总是面临类似的问题。 – yuk 2010-06-23 18:33:11