如何从元胞数组中的矩阵中删除一行
How to remove a row from a matrix inside a cell array
我有一个大小为 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
中那些相应位置的矩阵,删除了零行。
您应该使用 cellfun
和 any
的组合:
A_new = cellfun(@(x) x(any(x~=0,2),:), A, 'UniformOutput', false);
应该可以解决问题。
我有一个大小为 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
中那些相应位置的矩阵,删除了零行。
您应该使用 cellfun
和 any
的组合:
A_new = cellfun(@(x) x(any(x~=0,2),:), A, 'UniformOutput', false);
应该可以解决问题。