找到连续的非零值

时间:2013-06-29 01:29:57

标签: matlab find return-value chain

我正在尝试编写一个简单的MATLAB程序,它将找到第一个连续非零值的链(超过70个)并返回该连续链的起始值。

我正在处理来自操纵杆的移动数据,并且在实际试验开始之前有几千行数据混合了零和非零值(来自在试验实际开始之前稍微移动操纵杆的对象)。 / p>

在我开始分析试验中的运动之前,我需要摆脱这些行。

我确信这是一件相对简单的事情,所以我希望有人可以提供见解。 提前谢谢

编辑:这是我试过的:

s = zeros(size(x1)); 

for i=2:length(x1) 
    if(x1(i-1) ~= 0) 
        s(i) = 1 + s(i-1); 
    end 
end 

display(S); 

对于矢量x1,其最大链为72,但我不知道如何找到最大链并返回其第一个值,所以我知道在哪里修剪。我也不认为这是最好的策略,因为我的数据中的最大链将是成千上万的值。

2 个答案:

答案 0 :(得分:2)

此答案适用于任何链条尺寸。它在向量x1中找到最长的链,并检索该链val的第一个元素。

首先,我们将使用bwlabel标记已连接的组件,例如:

s=bwlabel(x1);

然后我们可以使用tabulate获取s的频率表,并找到最大连通分量的第一个元素:

t=tabulate(s);
[C,I]=max(t(:,2));
val=x1(find(s==t(I,1),1, 'first'));

这适用于您有一个不同的最大尺寸链的情况。如果您有多个具有最大长度的链,会发生什么情况? (你仍然可以稍加修改地使用我的代码......)

答案 1 :(得分:1)

您无需使用辅助向量来跟踪索引:

for i = 1:length(x)
    if x(i) ~= 0
            count = count + 1;
    elseif count >= 70
            lastIndex = i;
            break;
    else
            count = 0;
    end

    if count == 70
           index = i - 69;
    end
end

要从x中移除链中的所有元素,您只需执行以下操作:

x = x([lastIndex + 1:end]);

编辑(基于评论):
你做它的方式不起作用的原因是因为当你遇到0时没有重置计数器,那就是:

else
   count = 0;

是为了;如果你愿意,它会重置这个过程。 为了更清楚一点,在原始代码中,这将反映在:

  if x1(i-1) ~= 0 
        s(i) = 1 + s(i-1); 
  else
        s(i) = 0;
  end