我正在尝试编写一个简单的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,但我不知道如何找到最大链并返回其第一个值,所以我知道在哪里修剪。我也不认为这是最好的策略,因为我的数据中的最大链将是成千上万的值。
答案 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