在 Matlab 中,如何从元胞数组中消除空列?

In Matlab, How to eliminate empty columns from the cell array?

所以在 3 X 18 元胞数组中,7 列是空的,我需要一个新的 3 X 11 元胞数组。有没有不循环的建议?

让我们考虑以下元胞数组。它的第二列仅包含 [],因此应将其删除。

>> 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 大小相同的矩阵。当且仅当 c{m,n} 为空时,它在条目 (m,n) 处包含 1
  2. ~cellfun('isempty' ,c)是上面的逻辑非,所以它包含1,其中c不为空。
  3. any(~cellfun('isempty' ,c), 1)any 应用于上面的每一列。因此,它是一个行向量,如果该列中 c 的任何单元格非空,则其第 m 个条目等于 1,否则 0
  4. 以上用作 select c 所需列的逻辑索引。

使用 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]