【问题标题】:How can I remove rows of a matrix in Matlab when the difference between two consecutive rows is more than a threshold?当两个连续行之间的差异超过阈值时,如何在 Matlab 中删除矩阵的行?
【发布时间】:2019-05-13 19:57:24
【问题描述】:

假设数据如下:

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.

此外,我猜测数组的大小在我删除一些元素时会发生变化。

最后,没有连续元素的差值必须大于阈值。

在实践中我想平滑下面有高波动的图片

【问题讨论】:

  • 从 2 开始循环。如果从 1 开始,qq-1 会给你一个索引 0,这是非法的。
  • @beaker,谢谢,我想我还有一个问题,因为我删除了一些数组大小变化的元素
  • 您只想检查第二列吗?为什么要保留4 76 8
  • "最后,没有连续元素的差值必须大于阈值。"这意味着,原则上,您最终可能会删除大部分数据。您确定始终只有一个元素处于关闭状态(异常值)吗?我不确定这是处理数据的最佳方式。也许您的意思是以对异常值具有鲁棒性的方式拟合曲线,例如robust LOESS
  • 没关系,我们都在不同的时区,有时您需要等待几个小时才能有人醒来。 :)

标签: arrays matlab loops


【解决方案1】:

您可以尝试使用数学形态学中的一个非常简单的过滤器,即使用大小为 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。在那些地方我们写回原始值。

【讨论】:

    【解决方案2】:

    你有几个错误:

    • 您的索引需要从 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
    

    【讨论】:

    • 谢谢,我是 Matab 的新手。您能否包括数据,以便我检查所需的行是否会消除?我猜它可能会删除更多行...
    • @CrisLuengo:实际上,我必须在不删除元素时增加qq,因为从技术上讲,删除会将下一个值移动到当前位置。是的,它很慢,但符合示例中所示的要求。
    • 作为最重要的条件,最后没有连续元素的差值必须大于阈值
    • @Ahmad:是的,上述解决方案应确保该条件。你试过了吗?
    • 我提炼了我的问题来陈述我的问题,你的解决方案仍然在有波动的曲线之间留下了间隙
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多