I am writing a function to remove some values from a cell array, like so:
function left = remove(cells, item);
left = cells{cellfun(@(i) ~isequal(item, i), cells)};
But when I run this, left has only the first value, as the call to cells{} with a logical array returns all of the matching cells as separate values. How do I group these separate return values into a single cell array?
Also, perhaps there is already a way to remove a given item from a cell array? I could not find it in the documentation.
You have to use
()instead of{}to index the cells:Using
()for indexing will give you a subset of cells, while using{}will return the contents of a subset of cells as a comma-separated list, and only the first entry of that list will get placed inleftin your example.You can check out this MATLAB documentation for more information on using cell arrays.
EDIT: Response to comment…
If you have an operation that ends up giving you a comma-separated list, you can place the individual elements of the list into cells of a cell array by surrounding the operation with curly braces. For your example, you could do:
The inner set of curly braces creates a comma-separated list of the contents of
cellsthat are not equal toitem, and the outer set then collects this list into a cell array. This will, of course, give the same result as just using parentheses for the indexing, which is the more sensible approach in this case.If you have a function that returns multiple output arguments, and you want to collect these multiple values into a cell array, then it’s a bit more complicated. You first have to decide how many output arguments you will get, or you can use the function NARGOUT to get all possible outputs:
Then you can collect the outputs into a 1-by-
nOutcell arrayoutArgsby doing the following:It should be noted that NARGOUT will return a negative value if the function has a variable number of output arguments, so you will have to choose the value for
nOutyourself in such a case.