8

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

所以这段代码

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

导致这个向量

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

但我想要这个数组

一个=

[1]    [2]

[3]    [4]

我该怎么做?

4

4 回答 4

17

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

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

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

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

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

于 2012-03-14T15:09:15.917 回答
1

这对我有用:

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

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

于 2012-03-14T09:27:37.647 回答
1

有一个函数可以概括从单元格中删除特定行/列,称为fun_removecellrowcols. 由于移除,单元格尺寸会调整大小。

于 2014-04-25T10:13:39.310 回答
0

针对您的问题的一个更简单的解决方案是将单元格直接转换为矩阵:

cleanedA = cell2mat(a);

它转换为普通矩阵,并在此过程中删除空单元格。

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

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

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

于 2012-03-14T10:41:30.990 回答