我想从大矩阵中删除一些列和行。这些是列和具有全零值的行。 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,:) = [] ;
为此我有一行代码会很好,因为我可能会反复执行此类任务。感谢
答案 0 :(得分:7)
一行代码是:
A=A(any(X,2),any(X,1))
没有必要像你一样使用find
,你可以直接使用逻辑向量进行索引。
答案 1 :(得分:2)
我将首先展示一个基于另一个duplicate question的简单示例,要求仅删除包含零元素的行。
给出矩阵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维:
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指出了极端情况;)