2017-04-20 65 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],其中有一个阵列a以相反方向继续,其中零点保持零,并且零点继续与指数值相反的指数方向,它被留在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)