如何从单元格数组中的矩阵中删除行

时间:2015-01-28 23:39:17

标签: arrays matlab matrix

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

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

现在,我想从这些子矩阵中删除零行,然后获得一个名为A的新A_new单元数组,其子矩阵不具有任何零行,如下所示:

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      

2 个答案:

答案 0 :(得分:2)

我要做的是取每个单元格,然后在矩阵的相对上使用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来查找我们需要保留的元素,然后将此新矩阵保存到相应的位于A_new

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

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

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

答案 1 :(得分:1)

您应该使用cellfunany的组合:

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

应该这样做。