我想从大矩阵中删除一些列和行。这些是具有所有零值的列和行。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发现边缘情况;)