在Matlab中,如何消除单元格数组中的空列?

时间:2015-06-11 11:13:25

标签: matlab cell-array is-empty

因此,在3 X 18单元阵列中,7列是空的,我需要一个3 X 11的新单元阵列。任何建议都不需要循环?

2 个答案:

答案 0 :(得分: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应用于上述各列。因此,如果该列中m的任何单元格非空,则其1 - 条目等于c,这是一个行向量,否则为0。 / LI>
  4. 上述内容用作选择c
  5. 所需列的逻辑索引

答案 1 :(得分: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]