matlab:在没有循环的情况下从单元格数组中的每个矩阵中删除零行

matlab: delete zero rows from each matrix in cell-array without loop

我的元胞数组如下所示:

>> 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)' 

那么有什么绝妙的解题方法吗?谢谢

如果您使用的是内置函数 nonZeros,您应该键入它 nonzeros,因为 Matlab 区分大小写。 (自 2011ish)。

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

试试这个:

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

使用celldisp

显示元胞数组
celldisp(out);