我想合并右边的块(由两个较小的块组成)看起来与左边的两个块完全一样。我在考虑形态学操作,但这些往往会改变原始形状,从而失去准确性。是否有任何其他信号处理工具可以提供帮助?数据以时间序列的形式呈现。
问问题
138 次
2 回答
1
首先我们需要一个测试数据集:
> x=1:40; y=x*0; y(5:10)=1; y(15:20)=1; y(25:30)=1;y(33:36)=1;
> disp([x;y])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0
现在我们先找到
> BlockStart = find( diff(y)>0 )+1
BlockStart =
5 15 25 33
和每个非零块的最后一个索引(请注意,数字确实与我用来制作测试数据的数字一致)
> BlockEnd = find( diff(y)<0 )
BlockEnd =
10 20 30 36
然后我们只删除 X 中第 3 和第 4 块之间的间隙(我重新排列了输出):
> x( BlockEnd(3)+1 : BlockStart(4)-1) = []; % delete the gap in X
> y( BlockEnd(3)+1 : BlockStart(4)-1) = []; % delete the gap in Y
> disp([x;y])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 33 34 35 36 37 38 39 40
0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0
您也可以用一个来填充 Y 中的空白,而不是删除这些元素:
> y( BlockEnd(3)+1 : BlockStart(4)-1) = 1;
> disp([x;y])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
于 2014-01-02T10:47:03.023 回答
0
有多种方法可以处理差距。这假设单个值可能意外为零(或低),并且应该固定以匹配其邻居:
vo =ones(1,3);
vz = zeros(1,3);
ts = [vo vz vo vz vz vo 0 vo];
bar(ts)
c = min(circshift(ts,[0 1]),circshift(ts,[0 -1]));
ts_nogap = max(ts,c);
figure, bar(ts_nogap)
对于更高级的要求,请考虑使用filter
代替circshift
或遍历所有值,并以您喜欢的任何方式探索它们的“邻居”。
于 2014-01-02T13:56:31.963 回答