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

时间:2010-04-14 08:41:29

标签: matlab

我有一个矢量例如

a = [0 1 0 3]

我想将a转换成等于b = [1 3]的b。

我如何执行此操作?所以我有一个零元素的向量,我想删除零,只留下非零数字?

7 个答案:

答案 0 :(得分:81)

如果您只想删除零,将非零隐藏在a中,那么最好的解决方案是

a(a==0) = [];

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

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

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

如果你想将零置于一个新的结果b中,同时保持不变,最好的方法可能是

b = a(a ~= 0);

同样,这里使用逻辑索引。您可以使用

的等效版本(就结果而言)
b = a(find(a ~= 0));

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

一如既往,请注意零或任何数字的EXACT测试,如果您接受的元素在某些epsilonic容差为零之内。做这样的测试

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

这仅保留了至少与容差一样大的元素。

答案 1 :(得分:8)

我刚遇到这个问题,想找到一些关于性能的内容,但我不能,所以我自己写了一个基准测试脚本:

% 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)的解决方案是两者中的更快:)

答案 2 :(得分:4)

我经常最终做这样的事情。因此,我尝试编写一个简单的功能,即“剪切”。以简单的方式排除不需要的元素。这使得matlab逻辑有点颠倒,但看起来不错:

b = snip(a,'0')

你可以在以下位置找到功能文件: http://www.mathworks.co.uk/matlabcentral/fileexchange/41941-snip-m-snip-elements-out-of-vectorsmatrices

它也适用于所有其他' x',nan或其他任何元素。

答案 3 :(得分:3)

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

答案 4 :(得分:2)

为什么不呢,a=a(~~a)a(~a)=[]。它与其他方法相当,但肯定不那么重要。

答案 5 :(得分:2)

数据

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]

答案 6 :(得分:2)

您可以使用稀疏(a),它将返回

(1,2)1

(1,4)3

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