4

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

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

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

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

编辑:这是我尝试过的:

s = zeros(size(x1)); 

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

display(S); 

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

4

2 回答 2

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'));

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

于 2013-06-29T04:05:11.533 回答
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 
于 2013-06-29T04:03:45.260 回答