2017-04-20 13 views
1

配列と論理配列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が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)