2015-06-11 72 views

回答

3

让我们考虑下面的单元阵列。其第二栏只包含[],所以应该删除。

>> c = {1 , [], 'a'; 2, [], []; 3, [], 'bc'} 
c = 
    [1] [] 'a' 
    [2] []  [] 
    [3] [] 'bc' 

可以计算出一个合理的指标,告诉哪些列应保持,然后用它来获得结果:

>> keep = any(~cellfun('isempty',c), 1); %// keep columns that don't only contain [] 
keep = 
    1  0  1      %// column 2 should be removed 
>> result = c(:,keep) 
result = 
    [1] 'a' 
    [2]  [] 
    [3] 'bc' 

它是如何工作

  1. cellfun('isempty' ,c)是与c大小相同的矩阵。它包含1在条目(m,n)当且仅当c{m,n}为空。
  2. ~cellfun('isempty' ,c)是以上的逻辑否定,所以它包含1其中c不为空。
  3. any(~cellfun('isempty' ,c), 1)any应用于上述的每一列。因此,如果该列中的任何c单元格都非空,那么它是一个行向量,因此其m条目等于1,否则0
  4. 以上用作逻辑索引来选择所需的c列。
+0

这简直是真棒解决方案!正是我需要的。你也可以请打破它(保持和结果部分),我想知道它是如何工作的:) – miprakas

+0

我很高兴这是你需要的。我已经添加了一个解释它的解释 –

+1

@LuisMendo非常感谢你,你真棒 –

1

使用cellfun检测的元素,然后从找到的空元素列和删除那些:

cellarray(:, any(cellfun(@isempty, cellarray), 1)) = []; 

相反,如果你想保持列与至少一个非空元素,使用all而不是any

例如:

>> cellarray = {1 2 ,[], 4;[], 5, [], 3} 

    [1] [2] [] [4] 
    [] [5] [] [3] 

>> cellarray(:,any(cellfun(@isempty, cellarray), 1))=[] 

cellarray = 

    [2] [4] 
    [5] [3] 
+0

星期二感谢抓住了! – brodoll