akki
akki

Reputation: 57

Removing elements from a cell array in MATLAB

I have a cell array as shown below:

a = {[1 2 3] [5 3 6] [9 1 3]};

Now I want to remove the 1s from every array in a that contains 1 so that the output is as shown

a = {[2 3] [5 3 6] [9 3]};

I know the indices of arrays in cell array 'a' which contain 1. This can be done using for loop and a temporary variable, but this is taking a lot of time (I want to perform the operation on a cell array of size something like 1x100000. The one above is just for an example)

I want to know if there is any direct method that can do this quickly.

Upvotes: 3

Views: 1487

Answers (3)

rayryeng
rayryeng

Reputation: 104464

As already commented by Suever, because you are using a cell array and it is a dynamic container, you don't have a choice but to iterate through each cell if you want to modify the contents. Just to be self-contained, here is the for loop approach to do things:

for ii = 1 : numel(a)
    a{ii} = a{ii}(a{ii} ~= 1);
end

This may be faster as it doesn't undergo the overhead of cellfun. The code above accesses the vector in each cell and extracts out those values that are not equal to 1 and overwrites the corresponding cell with this new vector.

Using your example:

a = {[1 2 3] [5 3 6] [9 1 3]};

We get:

>> format compact; celldisp(a)
a{1} =
     2     3
a{2} =
     5     3     6
a{3} =
     9     3

Upvotes: 1

ashraf
ashraf

Reputation: 1

This example shows how to remove data from individual cells, and how to delete entire cells from a cell array. To run the code in this example, create a 3-by-3 cell array:

C = {1, 2, 3; 4, 5, 6; 7, 8, 9};

Delete the contents of a particular cell by assigning an empty array to the cell, using curly braces for content indexing, {}:

C{2,2} = []

This code returns

C = 
    [1]    [2]    [3]
    [4]     []    [6]
    [7]    [8]    [9]

Delete sets of cells using standard array indexing with smooth parentheses, (). For example, this command

C(2,:) = []

removes the second row of C:

`

C = 
    [1]    [2]    [3]
    [7]    [8]    [9]`

Upvotes: -1

Suever
Suever

Reputation: 65430

Pretty much anything is going to be slow with that large of a cell array. You could try to do this with cellfun but it's not necessarily guaranteed to be any faster than a for loop.

a = cellfun(@(x)x(x ~= 1), a, 'UniformOutput', false);

%   a{1} =
%        2     3
%   a{2} =
%        5     3     6
%   a{3} =
%        9     3

Upvotes: 3

Related Questions