如何检测单元格数组中的空单元格?

37

我该如何检测一个单元格数组中的空单元格?我知道删除空单元格的命令是a(1) = [],但我好像无法让MATLAB自动检测哪些单元格为空。

背景:我使用了a=cell(1,53)预分配了一个单元格数组。然后我使用if exist(filename(i))和textscan来检查文件是否存在,并读取它。结果当filename(i)不存在时,就会出现一个空单元格,并且我们会继续下一个文件。

当我完成所有文件的读入后,我想要删除a中的空单元格。我尝试过if a(i)==[],但不起作用。

2个回答

61

使用CELLFUN

%# find empty cells
emptyCells = cellfun(@isempty,a);
%# remove empty cells
a(emptyCells) = [];

注意:a(i)==[]无法正常工作。如果您想知道第i个单元格是否为空,则必须使用花括号访问单元格内容。此外,==[]计算结果为空,而不是true/false,因此应该使用isempty命令。简而言之:a(i)==[]应重写为isempty(a{i})


17
为了轻微提高速度,可以使用emptyCells = cellfun('isempty', a);... cellfun内部有一个switch语句,用于检查字符串是否是其中几个函数之一,从而进行“神奇”的速度提升...这在这里有描述:http://undocumentedmatlab.com/blog/cellfun-undocumented-performance-boost/ - JudoWill
+1 是为了指定如何删除空单元格!这将使您得到一个仅包含非空条目的单元格数组! - Matteo
十年过去了,'isempty'仍然比'@isempty'快70倍。 - Chuck

0

以上提到的所有答案都是不正确的,因为在我的情况下,当我使用它们时,它们会删除空单元格,然后将我的单元格数组中的所有元素按行方式排列,而不是保留它们的实际形状。事实上,在使用这种方法之后,您的单元格数组元素往往会成为行单元格向量。

我已经找到了这种适用于我的情况的方法。

来源:https://groups.google.com/forum/#!topic/comp.softsys.matlab/p3NX0fI6u90

方法:

myCellARRAY(all(cellfun(@isempty,myCellARRAY),2), : ) = [];

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