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,:) = [] ; 这将是很好的,有一行代码,因为我可能会重复

我想从一个大矩阵中删除一些列和行。这些列和行的值均为零。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(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案例。