2017-04-20 1 views
1

배열을 a=[1,2,3,4,5,6,7,8], 논리 배열 b=[1,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1]을 얻는 방법 [1,1,1,1,2,3,2,1,1,1,2,3,4,5,6,7,8,8,8]을 얻는 방법은 배열이 반대 방향으로 계속되는 곳이 0 인 곳에서 계속 진행되고 0은 계속됩니다. 색인 값에서 반대 색인 방향으로 1에 남았습니다.Matlab의 논리 배열을 사용하여 배열을 배열

array   a=[1,2,3,4,5,6,7,8] 
logical array b=[1,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1] 
how to get  [1,1,1,1,2,3,2,1,1,1,2,3,4,5,6,7,8,8,8] 

답변

3

는 가장 우아한 방법이 있는지 모르겠어요,하지만 작동 :

a = [1,2,3,4,5,6,7,8]; 
len = length(a); 
b = [1,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1]; 
% find when b changes from 0 to 1 
bb = [0 diff(b)]; 
c = b; c(c == 0) = -1; 
c(bb == 1) = 0; 
% cumsum finds initial indexes 
d = cumsum(c); 
% truncate indexes if exceeds array 
while 1 
    ix = find(d < 1 | d > len,1,'first'); 
    if isempty(ix) 
     break; 
    end 
    if d(ix) < 1 
     d(ix:end) = d(ix:end) + 1; 
    else 
     d(ix:end) = d(ix:end) - 1; 
    end 
end 
res = a(d) 
관련 문제