我有一个矢量例如
a = [0 1 0 3]
Run Code Online (Sandbox Code Playgroud)
我想把a变成等于的b b = [1 3]
.
我一般如何执行此操作?所以我有一个零元素的向量,我想删除零,只留下非零数字?
小智 82
如果你只是想删除零,将非零隐藏在a中,那么最好的解决方案就是
a(a==0) = [];
Run Code Online (Sandbox Code Playgroud)
这将使用MATLAB中的逻辑索引方法删除零元素.当向量索引是与向量长度相同的布尔向量时,MATLAB可以使用该布尔结果对其进行索引.所以这相当于
a(find(a==0)) = [];
Run Code Online (Sandbox Code Playgroud)
而且,当你在MATLAB中将一些数组元素设置为[]时,约定就是删除它们.
如果你想将零置于一个新的结果b中,而保持不变,那么最好的方法就是
b = a(a ~= 0);
Run Code Online (Sandbox Code Playgroud)
同样,这里使用逻辑索引.您可以使用等效版本(就结果而言)
b = a(find(a ~= 0));
Run Code Online (Sandbox Code Playgroud)
但mlint最终会将该行标记为纯粹逻辑索引更有效的行,因此更合适.
一如既往,要注意零或任何数字的EXACT测试,如果你已经接受了某些epsilonic容差为零的元素.做那样的测试
b = a(abs(a) >= tol);
Run Code Online (Sandbox Code Playgroud)
这仅保留至少与容差一样大的那些元素.
我刚刚遇到这个问题,想找一些关于性能的东西,但我不能,所以我自己编写了一个基准测试脚本:
% 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
Run Code Online (Sandbox Code Playgroud)
所以你看,使用的解决方案A = A(A ~= 0)
是两个更快:)