2013-06-29 5 views
4

연속적인 0이 아닌 값의 첫 번째 체인 (70 개 이상)을 찾고 해당 연속 체인의 시작 값을 반환하는 간단한 MATLAB 프로그램을 작성하려고합니다.연속적인 0이 아닌 값을 찾습니다.

조이스틱에서 이동 데이터로 작업 중이며 실제로 시도가 시작되기 전에 (실제로 시도가 시작되기 전에 조이스틱을 약간 움직이는 피사체에서 오는) 0과 0이 아닌 값이 혼합 된 수천 개의 데이터 행이 있습니다.

시련에서 운동을 분석하기 전에 이러한 행을 제거해야합니다.

저는 이것이 비교적 간단한 것이므로 누군가가 통찰력을 제공하기를 바랍니다. 72의 최대 체인을 가지고있는 벡터 X1에 대한

s = zeros(size(x1)); 

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

display(S); 

하지만 최대 체인을 발견하고 그 첫 번째 값을 반환하는 방법을 잘 모릅니다 : 여기에 내가 시도 내용은 다음과 같습니다 사전에

편집을 주셔서 감사합니다 그래서 나는 다듬을 곳을 알고 있습니다. 또한 데이터의 최대 체인이 수만 개가되므로 최상의 전략이라고 생각하지 않습니다.

+1

안녕하십니까. 여기, [투어] (http://stackoverflow.com/about)를 가져 가라. 너 뭐 해봤 니? –

+0

s = 0 (크기 (x1)); i = 2에 대한 : 길이 (x1) if (x1 (i-1) ~ = 0) (i) = 1 + s (i-1); end end display (S); 72의 최대 사슬을 가지고있는 벡터 x1에 대해, 나는 최대 사슬을 찾고 그 첫 번째 값을 반환하는 방법을 모른다. 그래서 어디에서 다듬을 지 안다. 감사합니다 – thymeandspace

+0

문제 없습니다. 그래도 감사를 제거하기 위해 내 게시물을 편집했습니다. 그것은 하나의 질문에서 "적절한"것이 아닙니다. –

답변

1

당신은 인덱스를 추적 유지하기 위해 보조 벡터를 사용할 필요가 없습니다 :

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

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에서 체인의 모든 요소를 ​​제거하려면를

EDIT (덧글에 기반) :
당신이 0으로 만났을 때 카운터를 재설정하지 않았기 때문에 작동하지 않는 이유는 다음과 같습니다 :

을위한 것입니다. 원한다면 프로세스를 다시 설정합니다. 이 답변은 어떤 체인 크기에 대한 제네릭

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

편집에 도움이되기를 바랍니다. –

+1

훌륭해, 고마워. – thymeandspace

+0

문제 없습니다. 당신의 연구에 행운을 비네. –

2

: 좀 더 명확하게 들어 는 원래 코드에서, 이것은 반영 될 것이다. 벡터 x1에서 가장 긴 체인을 찾고 해당 체인 val의 첫 번째 요소를 검색합니다.

s=bwlabel(x1); 

그런 다음 우리는 s의 주파수 테이블을 얻을 수 tabulate를 사용하고, 가장 큰 연결된 구성 요소의 첫 번째 요소를 찾을 수 있습니다 :

처음에 우리는 예를 들어, 연결 구성 요소 레이블을 bwlabel를 사용합니다

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

하나의 별개의 최대 크기 체인이있는 경우에 적합합니다. 최대 길이를 가진 체인이 두 개 이상인 경우 어떻게됩니까? (여전히 약간의 수정으로 내 코드를 사용할 수 있습니다 ...)