我有一个矢量例如
a = [0 1 0 3]
我想将a转换成等于b = [1 3]
的b。
我如何执行此操作?所以我有一个零元素的向量,我想删除零,只留下非零数字?
答案 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
这使您可以保留有关非零条目的位置的信息。