【问题标题】:matlab: delete zero rows from each matrix in cell-array without loopmatlab:从没有循环的单元数组中的每个矩阵中删除零行
【发布时间】:2015-04-27 05:35:52
【问题描述】:

我有一个像这样的元胞数组:

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

那么有什么绝妙的方法来解决这些问题吗?谢谢。

【问题讨论】:

    标签: matlab loops cell-array


    【解决方案1】:

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

    试试这个:

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

    使用celldisp显示元胞数组

    celldisp(out);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-01-06
        • 1970-01-01
        • 2016-05-26
        • 2018-01-13
        • 1970-01-01
        • 2014-10-21
        • 1970-01-01
        • 1970-01-01
        • 2015-02-20
        相关资源
        最近更新 更多