Search code examples
matlabcell-array

How to find a non-zero number between two zeros in a cell array in matlab


I have a cell array (11000x500) with three different type of elements. 1) Non-zero doubles 2) zero 3) Empty cell

I would like to find all occurances of a non-zero number between two zeros.

E.g. A = {123 13232 132 0 56 0 12 0 0 [] [] []};

I need the following output out = logical([0 0 0 0 1 0 1 0 0 0 0 0]);

I used cellfun and isequal like this

out = cellfun(@(c)(~isequal(c,0)), A);

and got the follwoing output

out = logical([1 1 1 0 1 0 1 0 0 1 1 1]);

I need help to perform the next step where i can ignore the consecutive 1's and only take the '1's' between two 0's

Could someone please help me with this?

Thanks!


Solution

  • You can use conv to find the elements with 0 neighbors (notice that the ~ has been removed from isequal):

    out = cellfun(@(c)(isequal(c,0)), A);      % find 0 elements
    out = double(out);                         % cast to double for conv
    % elements that have more than one 0 neighbor
    between0 = conv(out, [1 -1 1], 'same') > 1;
    
    between0 =
    
       0   0   0   0   1   0   1   0   0   0   0   0
    

    (Convolution kernel corrected to fix bug found by @TasosPapastylianou where 3 consecutive zeros would result in True.)

    That's if you want a logical vector. If you want the indices, just add find:

    between0 = find(conv(out, [1 -1 1], 'same') > 1);   
    
    between0 =
    
       5   7