MATLAB:移动积分器(求和)Window,大小可变,基于条件
MATLAB: Moving Integrator (Sum) Window with Varying Size, Based on a Condition
我想根据 array
值的累积和定义移动积分器(总和)window 的开始和结束索引。每个 window 的累积总和应小于或等于阈值。
此 window 的 end_index
为未来 windows 统一向前移动 1,但是 start_index
取决于 [=11= 的值]. start_index
可以向前移动,保持不变或向后移动(负值),因此移动 window 的大小不固定。
例如:
array = [ 1 0 2 1 1 2 0 0 1 2 0 1 0 1 1]
;
随着 start_index = 1
,第一个 window 的 array
的累积总和将在 end_index = 5
处为 5。
现在对于下一个 window,end_index
向前移动 1,这样新的 end_index = 6
。我想知道如何通过从新的 end_index
回算累计和来找到新的 start_index
以便新的 cumsum
小于或等于 5 window 还有。在这种情况下,新的start_index = 4
。
关于如何完成的任何建议?
谢谢。
找到任何给定 start_index 的 end_index:
start_index = 2;
threshold = 20;
if(sum(start_index:end)<threshold) %Error checking
end_index = -1;
else
end_index = find(cumsum(array(start_index:end)) >= threshold,1) + start_index - 1;
end
找到任何给定 end_index 的 start_index:
end_index = 6;
threshold = 20;
if(sum(1:end_index)<threshold) %Error checking
start_index = -1;
else
start_index = end_index + 1 - find(cumsum(fliplr(array(1:end_index))) >= threshold,1);
end %Error checking
我们的想法是,如果我们想从起始索引中获得累积和 k
,则无需再次计算 cumsum。相反,只有 cumsum 计算了 onec,而期望的累积和是原始累积和与原始累积和的第 k-1
个元素的差
original_Summ = [1 1 3 4 5 7 7 7 8 10 10 11 11 12 13]
k=3
new_Summ = original_Summ - original_Summ(k-1)
注意:如果 array
的大小过大,以下实施可能会导致内存限制。相反,每个 cmp 和 cmp1 都应该在每次迭代中进行计算。
array = [ 1 0 2 1 1 2 0 0 1 2 0 1 0 1 1 ];
%forward cumsum
fwd = cumsum(array);
%backward cumsum
bkw = cumsum(array(end:-1:1));%cumsum(array,'reverse')
%difference of cumulative sum with all starting indices
cmp = bsxfun(@minus,fwd,[0 fwd(1:end-1)].');%in matlab r2016b cmp= fwd-[0 fwd(1:end-1)].'
cmp1= bsxfun(@minus,bkw,[0 bkw(1:end-1)].');%in matlab r2016b cmp1=bkw-[0 bkw(1:end-1)].'
%find last indices of elements that are <=5
[r, c] = find(cmp <=5);
idx = accumarray(r,c,[],@max);
[r1, c1] = find(cmp1 <=5);
idx1 = accumarray(r1,c1,[],@max);
idx1 =flipud(numel(array) + 1-idx1);
%loop to find indices from previous indices
si = 1;
index={};
while true
ei = idx(si);
if ei == numel(array)
break;
end
index {end+1} = [si,ei];
ei = ei+1;
si = idx1(ei);
index {end+1} = [si,ei];
end
disp(index)
我想根据 array
值的累积和定义移动积分器(总和)window 的开始和结束索引。每个 window 的累积总和应小于或等于阈值。
此 window 的 end_index
为未来 windows 统一向前移动 1,但是 start_index
取决于 [=11= 的值]. start_index
可以向前移动,保持不变或向后移动(负值),因此移动 window 的大小不固定。
例如:
array = [ 1 0 2 1 1 2 0 0 1 2 0 1 0 1 1]
;
随着 start_index = 1
,第一个 window 的 array
的累积总和将在 end_index = 5
处为 5。
现在对于下一个 window,end_index
向前移动 1,这样新的 end_index = 6
。我想知道如何通过从新的 end_index
回算累计和来找到新的 start_index
以便新的 cumsum
小于或等于 5 window 还有。在这种情况下,新的start_index = 4
。
关于如何完成的任何建议?
谢谢。
找到任何给定 start_index 的 end_index:
start_index = 2;
threshold = 20;
if(sum(start_index:end)<threshold) %Error checking
end_index = -1;
else
end_index = find(cumsum(array(start_index:end)) >= threshold,1) + start_index - 1;
end
找到任何给定 end_index 的 start_index:
end_index = 6;
threshold = 20;
if(sum(1:end_index)<threshold) %Error checking
start_index = -1;
else
start_index = end_index + 1 - find(cumsum(fliplr(array(1:end_index))) >= threshold,1);
end %Error checking
我们的想法是,如果我们想从起始索引中获得累积和 k
,则无需再次计算 cumsum。相反,只有 cumsum 计算了 onec,而期望的累积和是原始累积和与原始累积和的第 k-1
个元素的差
original_Summ = [1 1 3 4 5 7 7 7 8 10 10 11 11 12 13]
k=3
new_Summ = original_Summ - original_Summ(k-1)
注意:如果 array
的大小过大,以下实施可能会导致内存限制。相反,每个 cmp 和 cmp1 都应该在每次迭代中进行计算。
array = [ 1 0 2 1 1 2 0 0 1 2 0 1 0 1 1 ];
%forward cumsum
fwd = cumsum(array);
%backward cumsum
bkw = cumsum(array(end:-1:1));%cumsum(array,'reverse')
%difference of cumulative sum with all starting indices
cmp = bsxfun(@minus,fwd,[0 fwd(1:end-1)].');%in matlab r2016b cmp= fwd-[0 fwd(1:end-1)].'
cmp1= bsxfun(@minus,bkw,[0 bkw(1:end-1)].');%in matlab r2016b cmp1=bkw-[0 bkw(1:end-1)].'
%find last indices of elements that are <=5
[r, c] = find(cmp <=5);
idx = accumarray(r,c,[],@max);
[r1, c1] = find(cmp1 <=5);
idx1 = accumarray(r1,c1,[],@max);
idx1 =flipud(numel(array) + 1-idx1);
%loop to find indices from previous indices
si = 1;
index={};
while true
ei = idx(si);
if ei == numel(array)
break;
end
index {end+1} = [si,ei];
ei = ei+1;
si = idx1(ei);
index {end+1} = [si,ei];
end
disp(index)