2013-11-14 4 views
0

프로젝트의 경우 벡터에서 일련의 첫 번째 1을 찾으려고합니다. 예를 들어, 내가 입력으로 있습니다matlab에서 벡터의 요소를 변환

x1=[1 0 0 1 1 1 0 1 0 1 0 0 1 1] 

내가 출력으로 필요

Y1=[1 0 0 1 0 0 0 1 0 1 0 0 1 0] 

그래서 때마다 벡터의 1이 모든 결과의 사람들이 '1'에서 '0'으로 전환 될 필요가있다.

다음 코드가 있지만 어떤 이유로 x1과 정확히 같은 값을 가진 Y1을 반환합니다.

n=numel(x1); 
Y1=zeros(n,1); 
for i = 1:n 
if x1(i) == 1 
    Y1(i)= 1; 
    for j = (i+1): n 
     if x1(j)== 1 
      Y1(j)=0; 
     elseif x1(j) == 0 
      Y1(j)=0; 
      i=j+1; 
      break 
     end 
    end 
elseif x1(i) == 0 
    Y1(i)= 0; 
end 

end 

모든 도움을 주시면 감사하겠습니다.

답변

4

간편한 diff. 루프가 필요 없습니다.

Y1 = [ x1(1) diff(x1)==1 ]; 

또는


원리 등가

Y1 = diff([0 x1])==1; 
: diff은 앞 요소에 대한 요소의 차이를 계산한다. 그 차이가 1 일 때 새로운 것들이 시작되었습니다. 첫 번째 요소는 특별한 대우가 필요합니다.

+0

답장을 보내 주셔서 감사합니다. – user2991702

+0

@ user2991702 환영합니다 :-) 만약 당신이 Matlab을 처음 사용한다면 "vectorized"일을 해보십시오. 루프가 다른 언어에서 사용되는 경우가 많이 있지만 Matlab에서는 'diff', 'sum'등과 같은 벡터화 된 연산을 사용하여 더 쉽게 (일반적으로 더 빠르게) 수행 할 수 있습니다. –

0

당신의 벡터는 단지 0과 1이 포함되지 않은 경우를 @Luis에 의한 대답의 일반화 :

Y1 = diff([0 x1]) & x1 == 1 

값이 하나인지이 검사를하고, 이전과 다른 여부 값.

관련 문제