删除MATLAB中的空单元格

时间:2012-03-14 08:00:37

标签: matlab cells

我想删除matlab单元格数组底部的所有空单元格。但是我发现的所有代码示例都将矩阵折叠为矢量,这不是我想要的。

所以这段代码

a = { 1, 2; 3, 4; [], []}
emptyCells = cellfun('isempty', a); 
a(emptyCells) = []

导致此向量

  

a = [1] [3] [2] [4]

但我想要这个数组

  

a =

[1]    [2]

[3]    [4]

我该怎么做?

4 个答案:

答案 0 :(得分:16)

如果要删除单元格数组中所有单元格为空的所有行,可以使用以下内容:

a = { 1, 2; 3, 4; [], []}
emptyCells = cellfun('isempty', a); 

a(all(emptyCells,2),:) = []

a = 
    [1]    [2]
    [3]    [4]

它在你的公式中不起作用的原因是,如果你使用数组索引,输出将被重新整形为一个向量(因为不能保证将删除整个行或列,而不是简单的单个元素)。

答案 1 :(得分:1)

这对我有用:

a = { 1, 2; 3, 4; [], []};
emptyCells = cellfun('isempty', a);
cols = size(a,2);
a(emptyCells) = [];
a = reshape(a, [], cols);

但是我不确定它对你来说是否足够通用 - 你的阵列底部是否总有完整的空单元格行?

答案 2 :(得分:1)

有一个函数可以推广从一个单元格中删除特定的行/列,称为fun_removecellrowcols。由于移除,细胞尺寸调整大小。

答案 3 :(得分:0)

一个非常特定于您的问题的简单解决方案是将单元格直接转换为矩阵:

cleanedA = cell2mat(a);

它转换为普通矩阵,并在执行此操作时删除空单元格。

然后,当然,您可以使用以下命令将其重新转换为单元格数组:

a = mat2cell(cleanedA, [1 1], [1 1])

它不是通用的,但对于发布的示例,它是我能想到的最简单的解决方案。