如何在Matlab中删除向量中的零组件?

我有一个向量例如

a = [0 1 0 3] 

我想把a变成b等于b = [1 3]

我如何执行这一般? 所以我有一个零组件的向量,我想删除零,只留下非零数字?

如果你只是想删除零,留下非零零,那么最好的解决scheme是

 a(a==0) = []; 

这将删除零元素,在MATLAB中使用逻辑索引方法。 当一个向量的索引是一个与向量长度相同的布尔向量时,MATLAB可以使用该布尔结果来索引它。 所以这相当于

 a(find(a==0)) = []; 

而且,当您在MATLAB中将一些数组元素设置为[]时,惯例是删除它们。

如果你想把零置入新的结果b,而保持不变,最好的办法可能是

 b = a(a ~= 0); 

再次,这里使用逻辑索引。 你可以使用相当的版本(根据结果)

 b = a(find(a ~= 0)); 

但是mlint最终会将该行标记为纯逻辑索引更有效的行,因此更合适。

与往常一样,要小心EXACTtesting零或任何数字,如果你会接受一个在一定的epsilonic零容忍的元素。 做这样的testing

 b = a(abs(a) >= tol); 

这只保留那些至less与你的宽容一样大的元素。

我刚刚遇到了这个问题,想find一些关于性能的东西,但是我不能,所以我自己写了一个基准脚本:

 % Config: rows = 1e6; runs = 50; % Start: orig = round(rand(rows, 1)); t1 = 0; for i = 1:runs A = orig; tic A(A == 0) = []; t1 = t1 + toc; end t1 = t1 / runs; t2 = 0; for i = 1:runs A = orig; tic A = A(A ~= 0); t2 = t2 + toc; end t2 = t2 / runs; t1 t2 t1 / t2 

所以你看,使用A = A(A ~= 0)的解决scheme是两个更快的:)

我经常结束这样的事情。 所以我试图写一个简单的函数,以简单的方式“剪切”不需要的元素。 这使得matlab逻辑有点颠倒,但看起来不错:

 b = snip(a,'0') 

你可以find函数文件: http : //www.mathworks.co.uk/matlabcentral/fileexchange/41941-snip-m-snip-elements-out-of-vectorsmatrices

它也适用于所有其他“X”,南或任何元素。

 b = a(find(a~=0)) 

为什么不只是, a=a(~~a)或者a=a(~~a) a(~a)=[] 。 这相当于其他方法,但肯定不太关键。

数据

 a=[0 3 0 0 7 10 3 0 1 0 7 7 1 7 4] 

 aa=nonzeros(a)' 

结果

 aa=[3 7 10 3 1 7 7 1 7 4] 

你可以使用稀疏(一),这将返回

(1,2)1

(1,4)3

这使您可以保留关于您的非零条目的位置的信息。