删除MATLAB中的空单元格

问题描述 投票:7回答:4

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

所以这段代码

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

得到这个向量

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

但我想要这个数组

a =

[1]    [2]

[3]    [4]

我该怎么办?

matlab cells
4个回答
16
投票

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

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);

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


1
投票

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


0
投票

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

cleanedA = cell2mat(a);

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.