Matlab 删除空单元格数组

Matlab 删除空单元格数组,matlab,cell-array,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 =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));
但是,您提到了将多个元素组合到单个元素中。您可以通过使用
{:}
展开来实现这一点。这实际上是将所有已索引的元素扩展为单独的输入。因此,如果我们将这些元素作为输入,我们可以沿着指定的维度连接所有元素

newcell = arrayfun(@(x)cat(2, mycell{:,:,x}), 1:size(mycell, 3), 'uni', 0);
只是为了证明:

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]

mycell(cellfun(@isempty,mycell))=[]
?谢谢。“isempty”函数不起作用。它删除了所有的空单元格,但将mycell(:,:,1)和mycell(:,:,2)的结果合并成一个ans,因此我在这里问了这个问题。你的最后一种方法解决了这个问题。正如我之前得到的结果,如[1*9 single]等等……我是否可以将它们转换为矩阵,即将每个单元格转换为不同的矩阵@是的,您可以使用
num2cell
m=num2cell(data)
我已经将我的单元格定义为(1100,2),所以它有1行100列..我得到的结果是[1*9 single]。在使用num2cell之后,我得到的值是第1列第9=[1][1][1]……以此类推。。。是否有可能获得三维输出..类似于[2*2*2]或任何东西。我希望输出为xyz格式,以便将其视为RANSAC的输入