如何在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
这使您可以保留关于您的非零条目的位置的信息。