arrays - 如何从元胞数组中的矩阵中删除一行

标签 arrays matlab matrix

我有一个大小为 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      

结束

最佳答案

我要做的是获取每个单元格,然后使用 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,其中每个元素都是 A 中那些相应位置的矩阵,其中删除了零行。

关于arrays - 如何从元胞数组中的矩阵中删除一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28204519/

相关文章:

Python:将 float 字符串解包为复数

python - 如何制作字节列表?

matlab - 在 Matlab 中更有效地遍历矩阵元素

python - 如何在 Numpy 中使用数组作为它自己的索引

c - 二维字符数组中的排序列

python - 将 cython 中的 numpy 数据分配给 View

javascript - 如何使用事件处理程序连续循环遍历数组列表(从末尾恢复到开头)

matlab - 我有一个数字单元格,它是一个更大集合的子集,我可以将缺失的数字组合在一起吗 MATLAB

matlab - 在 MATLAB 图中用值标记点

arrays - 在 Matlab 中索引 m 维数组(m 不是常数)