从矩阵矩阵中删除零列和行

  • 本文关键字:零列 删除 matlab
  • 更新时间 :
  • 英文 :


我想从大矩阵中删除一些列和行。这些是具有所有零值的列和行。MATLAB 中是否有任何函数可以非常快速地为您完成?我的矩阵很稀疏。我这样做:

 % To remove all zero columns from A
 ind = find(sum(A,1)==0) ;
 A(:,ind) = [] ;
 % To remove all zeros rows from A
 ind = find(sum(A,2)==0) ;
 A(ind,:) = [] ;
最好

有一行代码,因为我可能会重复执行此类任务。谢谢

一行代码是:

A=A(any(A,2),any(A,1))
无需

像以前那样使用find,可以直接使用逻辑向量进行索引。any 函数查找包含任何非零元素的行或列。

1 维:

我将首先展示一个基于另一个重复问题的更简单的示例,要求仅删除包含零元素的

给定矩阵A=[1,2;0,0];

要删除0行,您可以:

  • 对每行的绝对值求和(以避免负数和正数混合出现零和(,这将为您提供行总和的列向量。

  • 保留总和不为零的每一行的索引。

在代码中:

A=[1,2;0,0];
% sum each row of the matrix, then find rows with non-zero sum
idx_nonzerolines = sum(abs(A),2)>0 ;
% Create matrix B containing only the non-zero lines of A
B = A(idx_nonzerolines,:) ;

将输出:

>> idx_nonzerolines = sum(abs(A),2)>0
idx_nonzerolines =
     1
     0
>> B = A(idx_nonzerolines,:)
B =
     1     2

2 尺寸:

相同的方法可用于 2 个维度:

A=[ 1,2,0,4;
    0,0,0,0;
    1,3,0,5];
idx2keep_columns = sum(abs(A),1)>0 ;
idx2keep_rows    = sum(abs(A),2)>0 ;
B = A(idx2keep_rows,idx2keep_columns) ;

输出:

>> B = A(idx2keep_rows,idx2keep_columns)
B =
     1     2     4
     1     3     5

感谢评论中的@Adriaan发现边缘情况;)

最新更新