MATLAB中如何删除空单元格

9
我希望您能够翻译以下内容:需要删除matlab单元数组底部所有空单元格,但是我找到的所有代码示例都会将矩阵折叠成向量,这不是我想要的。因此,以下代码...
a = { 1, 2; 3, 4; [], []}
emptyCells = cellfun('isempty', a); 
a(emptyCells) = []

这个向量的结果如下:

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

但我想要的是这个数组:

a =

[1]    [2]

[3]    [4]

我该怎么做?

4个回答

17
如果您想删除所有单元格均为空的单元格数组中的行,则可以使用以下方法:
a = { 1, 2; 3, 4; [], []}
emptyCells = cellfun('isempty', a); 

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

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

在您的公式中无法正常工作的原因是,如果使用数组进行索引,则输出将被重塑为向量(因为不能保证整行或整列将被删除,而不仅仅是某个元素)。


1
这对我有效:
a = { 1, 2; 3, 4; [], []};
emptyCells = cellfun('isempty', a);
cols = size(a,2);
a(emptyCells) = [];
a = reshape(a, [], cols);

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


目前是这样,但总的来说我不能确定。我也考虑使用reshape,但最终我使用了一个简单的搜索方法来查找最后一行不为空的数据,因为我觉得你发布的代码太复杂或者与实际任务不太相符。 - Matthias Pospiech

1
有一个名为fun_removecellrowcols的函数,它可以将特定的行/列从单元格中移除,并且会调整单元格的尺寸。

0
一个非常针对你的问题的简单解决方案是将单元格直接转换为矩阵:
cleanedA = cell2mat(a);

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

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

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

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


实际上,我的单元数组主要由字符串组成,因此cell2mat对我没有用处。 - Matthias Pospiech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接