Matlab 从矩阵中删除零列和行
我想从一个大矩阵中删除一些列和行。这些列和行的值均为零。MATLAB中有什么函数可以很快为您实现吗?我的矩阵是稀疏的。我是这样做的:Matlab 从矩阵中删除零列和行,matlab,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,:) = [] ; 这将是很好的,有一行代码,因为我可能会重复
% 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(X,2),any(X,1))
无需像以前那样使用find
,您可以直接使用逻辑向量进行索引。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在评论中指出了edge案例;) 你的代码看起来不错。如果你的矩阵是稀疏的,那么当你复制非零元素时(不知道,只是猜测):B=a(~ind,:)
。使用all(a,1)
或all(a,2)
可能比sum(a,1)
快,但我没有检查。谢谢。你说得对,我在检查any
和all
。最好的选择似乎是:A(:,~any(A))=[]
(删除零列)和A(~any(A'),:)=[]
(删除所有零行)。请confirm@Yas我认为A(~any(A,2),:)=[]
比A(~any(A'),:)=[]
快。您可能还想尝试A=A(any(A,2),:)
,因为=[]
可能会慢一些:@GameOfThrows:我不认为这个问题是重复的。另一个问题是删除所有的零。它可以是一行,如B=A(和(A,1)>0,和(A,2)>0)
。我很想看到纯逻辑(any
和all
)和sum
之间的时间差异。当然,尽管另一个答案已经是一行,从技术上讲与我的答案非常接近(调用了不同的函数,但涉及相同的原则)。所以我想,为了让它更与众不同,我会在不走所有捷径的情况下对这个过程进行更多的解释。@Adrian,谢谢,我确实忽略了edge案例。