【问题标题】:How to remove a row from a matrix inside a cell array如何从单元格数组中的矩阵中删除一行
【发布时间】:2015-01-28 23:39:16
【问题描述】:

我有一个大小为 400 x 1 的单元格数组 (A),该数组的每个单元格都包含一个大小为 9 x 4 的矩阵。因此,它看起来像这样:

A={[9x4 double];[9x4 double];...;[9x4 double]};

现在,我想从这些子矩阵中删除零行,然后获得一个名为 A_new 的新 A 元胞数组,其中它的子矩阵没有这样的零行:

A_new={[5x4 double];[7x4 double];...;[4x4 double]};

通过下面的代码,我可以找到不为零的行的索引,但我无法像上面提到的那样创建我的单元格数组。这是我编写的代码,对于粗体部分,我有一个问题,我无法解决。

  for i=1:A_Length
     [row,col]=find(A{i,1});
     out=[row col];
     NNZ_row=unique(row);
     Length_NNZ= length(NNZ_row);
  for j=1:Length_NNZ
     **A_NonZero{i,1}= ??????????**
  end      

结束

【问题讨论】:

    标签: arrays matlab matrix


    【解决方案1】:

    我要做的是获取每个单元格,然后在矩阵的对面上使用all 在每行中的所有列上确定哪些行包含全零。完成此操作后,使用这些位置并从该矩阵中删除这些行并将其保存到新矩阵中。

    因此,这样做:

    A_new = cell(1,numel(A));
    for i=1:numel(A)
       mat = A{i};
       ind = all(~mat, 2);
       A_new{i} = mat(~ind,:);
    end
    

    第一行代码创建一个与A 大小相同的新元胞数组。接下来,对于A中的每个元素,提取每个单元格位置的矩阵,在这个矩阵的对面使用all找到我们需要保留的元素,然后将这个新矩阵保存到@987654328中的对应位置@。

    如果您想在一行代码中执行此操作,请使用cellfun

    A_new = cellfun(@(x) x(~all(~x,2),:), A, 'uni', 0);
    

    cellfun 的第一个参数是一个匿名函数,它执行 for 循环所做的事情。我们找到那些包含全零的行,并使用它们来删除元胞数组中每个矩阵中的行。第二个参数是我们要操作的矩阵,即A'uni'0 标志很重要,因为输出不是单个值而是矩阵,因此该函数的输出将是一个与 A 大小相同的元胞数组,其中每个元素都是这些元素的矩阵A 中的对应位置,删除了零行。

    【讨论】:

    • 感谢您的全面回答。您建议的两种方法都可以正常工作。我更喜欢使用你的第一个建议
    • @user3185893 - 我的荣幸。我采用了第一种方法,因为您的代码中已经有一个循环。我只是修改了它以适合您的算法。祝你好运!
    【解决方案2】:

    您应该使用cellfunany 的组合:

    A_new = cellfun(@(x) x(any(x~=0,2),:), A, 'UniformOutput', false);
    

    应该可以解决问题。

    【讨论】:

    • THX。它工作正常。但另一个答案更适合我。再次感谢您的正确答案
    猜你喜欢
    • 2012-11-18
    • 2016-07-16
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多