matlab:从单元数组中的每个矩阵中删除零行而不进行循环

时间:2015-04-27 05:35:52

标签: matlab loops cell-array

我的单元格数组如下所示:

>> celldisp(C)

C{1} = 

 4     2     7    10
 0     0     0     0
 0     0     0     0
 0     0     0     0
 0     0     0     0

C{2} =

 4     2     7    10
 8     2     8     8
 0     0     0     0
 0     0     0     0
 0     0     0     0 

C{3} =

 4     2     7    10
 8     2     8     8
 8     4     1     6
 0     0     0     0
 0     0     0     0

C{4} =

 4     2     7    10
 8     2     8     8
 8     4     1     6
 3     1     3     4
 0     0     0     0 

C{5} =

 4     2     7    10
 8     2     8     8
 8     4     1     6
 3     1     3     4
 3     2     3     9

现在我想删除所有用零填充的行,所以我可以让单元看起来像这样:

C{1} =

 4     2     7    10

C{2} =

 4     2     7    10
 8     2     8     8

C{3} =

 4     2     7    10
 8     2     8     8
 8     4     1     6

C{4} =

 4     2     7    10
 8     2     8     8
 8     4     1     6
 3     1     3     4

C{5} =

 4     2     7    10
 8     2     8     8
 8     4     1     6
 3     1     3     4
 3     2     3     9

如何在没有任何循环的情况下执行此操作? PS:我试图使用

'cellfun(@(c_el) nonZeros(c_el), C,'UniformOutput',false)' 

但是matlab显示

Undefined function 'nonZeros' for input arguments of type 'double'. 
Error in @(c_el)nonZeros(c_el)' 

那么有什么好方法可以解决问题吗?感谢。

2 个答案:

答案 0 :(得分:2)

正如其他答案所提到的,你需要使用nonzeros,但即使这样做,输出的顺序也不会被保留。相反,你可以

试试这个:

out = cellfun(@(x) x(any(x,2),:),C,'UniformOutput',false);

使用celldisp

显示单元格数组
celldisp(out);

答案 1 :(得分:0)

如果您使用内置函数nonZeros,则应键入nonzeros,因为Matlab区分大小写。 (自2011年起)。