在MATLAB中从单元格数组中删除元素

时间:2016-06-23 17:46:45

标签: arrays matlab indexing cell-array

我有一个单元格数组,如下所示:

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

现在我要从a中包含1的每个数组中删除1,以便输出如图所示

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

我知道单元格数组中数组的索引' a'它包含1.这可以使用for循环和一个临时变量来完成,但这需要花费很多时间(我想对像1x100000这样大小的单元格数组执行操作。上面的那个只是例如)

我想知道是否有任何可以快速完成此操作的直接方法。

3 个答案:

答案 0 :(得分:3)

对于那么大的单元阵列来说,几乎任何东西都会变慢。您可以尝试使用cellfun执行此操作,但不一定能保证比for循环更快。

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

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

答案 1 :(得分:1)

正如Suever已经评论过的那样,因为您正在使用单元格数组并且它是一个动态容器,所以如果要修改内容,则无法选择迭代每个单元格。只是为了自成一体,这里是for循环方法来做事:

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

这可能会更快,因为它不会经历cellfun的开销。上面的代码访问每个单元格中的向量,并提取出那些不等于1的值,并用这个新向量覆盖相应的单元格。

使用您的示例:

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

我们得到:

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

答案 2 :(得分:-1)

此示例显示如何从单个单元格中删除数据,以及如何从单元格数组中删除整个单元格。要运行此示例中的代码,请创建一个3乘3的单元阵列:

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

通过为单元格指定空数组来删除特定单元格的内容,使用花括号进行内容索引,{}:

C{2,2} = []

此代码返回

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

使用带有平滑括号的标准数组索引删除单元格集()。例如,这个命令

C(2,:) = []

删除第二行C:

`

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