删除空元胞数组

Deleting Empty cell arrays

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

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 值] 等等......就像在单元格数组上并在一个单元格中获取值......由于这个循环我无法这样做。

删除空单元格很简单(类似于)。本质上,这会在每个单元格元素上调用 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]