假设数据如下:
X y
1 5
2 6
3 1
4 7
5 3
6 8
我要删除3 1
和5 3
,因为它们与上一行的差异大于3。实际上,我想与他们绘制一个图并希望它平滑。 >
我尝试了
for qq = 1:size(data,1)
if data(qq,2) - data(qq-1,2) > 3
data(qq,:)=[];
end
end
但是,它给出了:
Subscript indices must either be real positive integers or logicals.
此外,我猜想我删除一些元素后数组的大小也会改变。
最后,连续元素之间的差异不得大于阈值。
答案 0 :(得分:2)
您可以尝试的一种非常简单的数学形态学过滤器是使用大小为2的结构元素进行闭合。它将小于两个邻居的任何样本的值更改为两个邻居中最低的一个。其他值不变。因此,它不使用阈值来确定哪些样本有误,而只是看起来样本低于两个邻居:
y = [5, 6, 1, 7, 3, 8]; % OP's second column
y1 = y;
y1(end+1) = -inf; % enforce boundary condition
y1 = max(y1,circshift(y1,1)); % dilation
y1 = min(y1,circshift(y1,-1)); % erosion
y1 = y1(1:end-1); % undo boundary condition change
这将返回y1 = [5 6 6 7 7 8]
。
如果要防止因信号偏差而改变信号,可以将阈值作为第二步:
I = y1 - y < 3;
y1(I) = y(I);
这将找到我们更改信号的位置,但更改小于阈值3。在这些位置,我们会写回原始值。
答案 1 :(得分:1)
您有一些错误:
data
矩阵正在改变大小,因此不能使用具有固定迭代次数的for循环。改为使用while循环。这应该给您想要的结果:
qq = 2;
while qq <= size(data, 1)
if abs(data(qq, 2) - data(qq-1, 2)) > 3,
data(qq, :) = [];
else
qq = qq+1;
end
end