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

xia*_*dai 38 matlab

我有一个矢量例如

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)

这仅保留至少与容差一样大的那些元素.


tim*_*tim 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
Run Code Online (Sandbox Code Playgroud)

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