3

我有以下向量:

A=[1 0 1 0 0 1 0 1 0 0];
B=[1 2 3 4 5 6 7 8 9 10];

在这种情况下,A 表示时间向量,其中 1 表示一个时间单位的开始。现在我想将 B 中与具有相同长度的 3 步的时间单位相对应的所有值相加。所以在这个例子中,这意味着 B 的第 3、第 4 和第 5 个值以及第 8、第 9 和第 10 个值应该相加,因为它们的时间单位长度为 3。

B_result=[12 27];

我知道 cumsum() 是执行此操作的命令,但我不知道如何说只有取决于 A 的时间索引的这些特定值应该被求和。

你能帮助我吗?

多谢

4

4 回答 4

2

乔纳斯想法的更通用的应用:

A = [1 0 1 0 0 1 0 1 0 0 0 0 1];
B = [1 2 3 4 5 6 7 8 9 10 11 12];

n = 3;

result = arrayfun(@(x) sum( B(x:x+n-1) ), strfind([A,1],num2str(10^n+1)-48)) 

或使用,cumsum而不是sum,我不确定你真正想要什么:

result = arrayfun(@(x)  cumsum( B(x:x+n-1) ), ...
                       strfind( [A,1],num2str(10^n+1)-48 ) ,'uni',0) 

%optional:
result = cell2mat(result')
于 2014-07-28T15:26:34.963 回答
2

您可以cumsumaccumarray和一起使用hist

csa = cumsum(A); %// from begining og unit to unit indices
n = hist(csa, 1:max(csa));  %// count num of steps in each unit
B_result = accumarray( csa', B' ); %// accumulate B into different time units
B_result(n~=3) = []; %// discard all time units that do not have 3 steps
于 2014-07-28T13:35:57.273 回答
2
N = 3; %// We want to detect a one followed by exactly N-1 zeros. Call that
%// sequence an "interesting part"
ind = find([A 1]); %// find ones. Append a last one to detect a possible 
%// interesting part at the end.
ind = ind(diff(ind)==N); %// index of beginning of interesting parts
cs = cumsum(B); %// accumulate values
B_result = cs(ind+N-1)-cs(ind-1); %// use index to build result
于 2014-07-28T13:38:04.980 回答
2

对于更简单的模式匹配,您可以使用strfind

loc = strfind([A,1],[1 0 0 1]); %// add the 1 at the end of A and the pattern to avoid longer intervals
idx = bsxfun(@plus,loc,(0:2)'); %'// get the indices that need to be summed

result = sum(B(idx),1); %// obtain the result
于 2014-07-28T13:48:07.203 回答