MATLAB Answers

6

How do I remove the empty cells from a vector of cells?

Asked by Ned Gulley on 20 Jan 2011
Latest activity Edited by Jan
on 12 Mar 2017
I have a vector of cells which contain strings. Some of the cells in the vector are empty. I want to remove the empty cells from the vector.
Suppose I start with
strs = {'one','','two','three','','','four',''};
and I want to end with
strs = {'one','two','three','four'};

  2 Comments

if I have B = {[1 0 0 4],[0 0 0 0],[0 0 1 0],[0 0 2 3]} I want to remove zeros entries like this B = {[1 4],[],[1],[2 3]} How it is possible in cell vector
@Rajiv: This is a completely different question. Please do not high-jack this thread, but open a new one. Thanks.

Sign in to comment.

Products

5 Answers

Answer by Hy
on 20 Jan 2011
 Accepted Answer

The built-in function strcmp can compare a character array to a cell array of strings. Matching cells may be removed by setting them equal to the empty array.
strs(strcmp('',strs)) = [];

  0 Comments

Sign in to comment.


Answer by Matt Fig
on 20 Jan 2011

Probably the fastest approach:
strs = strs(~cellfun('isempty',strs)) % Call Built-in string

  2 Comments

Jan
on 21 Jan 2011
Or the other way around:
strs(cellfun('isempty',strs)) = []
This method is the most efficient solution.

Sign in to comment.


Answer by Ned Gulley on 20 Jan 2011

Here's one way to do it.
strs = {'one','','two','three','','','four',''};
empties = find(cellfun(@isempty,strs)); % identify the empty cells
strs(empties) = [] % remove the empty cells
This gives
strs =
'one' 'two' 'three' 'four'

  1 Comment

CELLFUN(@isempty) is remarkably slower than CELLFUN('isempty') as suggested by Matt Fig.

Sign in to comment.


Answer by Michael Katz on 20 Jan 2011

I wanted to do:
strs = setdiff(strs,{''})
but turns out it reorders the output:
strs =
'four' 'one' 'three' 'two'
So, I wound up with this:
[~,ix] = setdiff(strs,{''})
strs = strs(sort(ix))

  0 Comments

Sign in to comment.


Answer by Bryan White on 1 Feb 2011

For variety:
cellstr(strvcat(strs))'

  0 Comments

Sign in to comment.