我有一个大小为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
端
答案 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)
您应该使用cellfun
和any
的组合:
A_new = cellfun(@(x) x(any(x~=0,2),:), A, 'UniformOutput', false);
应该这样做。