当连续两行之间的差大于阈值时,如何在Matlab中删除矩阵的行?

时间:2019-05-13 19:57:24

标签: arrays matlab loops

假设数据如下:

X y
1 5
2 6
3 1
4 7
5 3
6 8

我要删除3 15 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.

此外,我猜想我删除一些元素后数组的大小也会改变。

最后,连续元素之间的差异不得大于阈值。

在实践中,我想在高波动的情况下平滑以下图片 enter image description here

2 个答案:

答案 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)

您有一些错误:

  • 您的索引必须从2开始,这样您就不会尝试为先前的索引编制索引0。
  • 您需要检查差异的绝对值大于3。
  • 由于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