MATLAB Answers

Delete rows from a subset of rows of a mixed cell array

1 view (last 30 days)
I have a mixed 6x7 cell array
A = {'text' 12 NaN 14 'text' 16 17; 'text' 0 NaN 24 25 26 27; 31 32 33 34 35 0 'text'; NaN 42 43 44 45 46 0; 51 'text' 53 54 NaN 56 57; 61 62 0 64 65 NaN 67};
How do I delete the rows from 2 to 5 that have one or more cells in columns 3 to 6 equal to NaN or zero? The remaining rows should be rows 1, 4 and 6. Rows 1 and 6 should remain because, even if they have NaNs or zeros in columns 3 to 6, they should not be considered for elimination, and row 4 should remain because it does not have NaNs or zeros in columns 3 to 6. Thanks!

  2 Comments

madhan ravi
madhan ravi on 5 Oct 2018
Just can you type the desired result so that it’s easier to understand the problem?
Giovanni Barbarossa
Giovanni Barbarossa on 5 Oct 2018
The answer should be
B = {'text' 12 NaN 14 'text' 16 17; NaN 42 43 44 45 46 0; 61 62 0 64 65 NaN 67};

Sign in to comment.

Accepted Answer

Matt J
Matt J on 5 Oct 2018
Edited: Matt J on 5 Oct 2018
keep=~any( cellfun( @(c)isequal(c,0)|isequaln(c,nan) , A(:,3:6) ) , 2);
keep([1,end])=1;
B=A(keep,:)

  6 Comments

Show 3 older comments
Giovanni Barbarossa
Giovanni Barbarossa on 5 Oct 2018
Hi Matt,
Actually, it only works in the special case I mentioned in my first question. For example, if I now want to delete the rows from 1 to 5 (rather than from 2 to 5) that have one or more cells in columns 3 to 6 equal to NaN or zero, I assume I should use:
keep=[true;...
~any( cellfun( @(c)isequal(c,0)|isequaln(c,nan) , A(1:end-1,3:6) ) , 2);...
true]
where I changed the starting row of A to be considered from 2 to 1 in your last syntax, then I get the following error:
The logical indices in position 1 contain a true value outside of the array bounds.
because the variable keep has now one more row (7) than the cell array A (6).
I am not sure why the variable keep increases in size.
Thanks
Matt J
Matt J on 5 Oct 2018
I am not sure why the variable keep increases in size.
Because A(1:end-1,3:6) has more rows than A(2:end-1,3:6). You've given more rows to the middle part of keep but didn't take anything away.

Sign in to comment.

More Answers (0)