2017-04-20 1 views
1

Disons un tableau a=[1,2,3,4,5,6,7,8], et un tableau logique b=[1,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1], comment obtenir [1,1,1,1,2,3,2,1,1,1,2,3,4,5,6,7,8,8,8], où il y a ceux que le tableau a continue en sens inverse où son a été laissé à zéro, et pour les zéros continue dans la direction de l'index opposé de la valeur de l'index, il a été laissé à un.Array Mapping avec Array logique Dans 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] 

Répondre

3

je ne sais pas si c'est la façon la plus élégante, mais il fonctionne:

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)