删除空单元格数组

时间:2016-03-21 22:16:13

标签: matlab cell-array

我已经使用循环创建了单元格数组并放置了值。这就是我所做的:

mycell =cell(1,100,num);       %% assume num anything
idx = 1;
[a,b] = size(depth);
for i=1:a
 for j=1:b
      if isfinite(depth(i,j)) 
      for segId=1:2
        mycell{:,idx,segId} = depth(i,j);
        idx=idx+1;

最后我得到了这样的结果:

mycell(;,:,1) = 
[1] [1.2] [1.222] [] [] [] [0.7] [06] [] [0.34] .....[100n]

mycell(;,:,2) = 
[] [] [] [1.33] [0.5] [0.3] [] [] [0.5] [] .....[100n]

有什么方法可以删除这些单元格数组中的空单元格......

或者有什么方法可以得到这样的输出: - [1 * 9值] [1 * 88值]等等......就像在单元格数组上一样,在一个单元格中获取值...由于这个循环,我无法做到这一点。

1 个答案:

答案 0 :(得分:0)

删除空单元格是微不足道的(类似于Luis's post)。本质上,这会在每个单元格元素上调用isempty,然后使用此逻辑数组索引到mycell并仅检索非空值。

newcell = mycell(cellfun(@isempty, mycell));

但是,您提到将多个元素组合到一个元素中。您可以使用{:}扩展来执行此操作。这基本上做的是将已编入索引的所有元素扩展为单独的输入。因此,如果我们将这些输入作为cat的输入,我们就可以连接指定维度上的所有元素。

只是为了证明:

a = {1, 2, 3};
cat(2, a{:});

    [1 2 3]

因此,在您的数据中,我们可以轻松地组合第三维第一个索引的所有数据:

item = cat(2, mycell{:,:,1});

我们也可以这样做,以便在第三维度上完全展平您的数据。

newcell = arrayfun(@(x)cat(2, mycell{:,:,x}), 1:size(mycell, 3), 'uni', 0);

如果采用第二种方法,您甚至不必担心首先删除空单元格,因为它们会在连接期间消失。

a = {1, 2, 3, [], 4};
cat(2, a{:});

    [1  2  3  4]