我有一个矩阵:
x = [0 0 0 1 1 0 5 0 7 0];
我需要删除所有的零,如下所示:
x = [1 1 5 7];
我使用的矩阵很大(1x15000),我需要多次(5000+)这样做,所以效率很关键!
答案 0 :(得分:16)
一种方式:
x(x == 0) = [];
关于时间的说明:
正如woodchips所提到的,与KitsuneYMG使用的方法相比,此方法似乎很慢。 Loren在她的一个MathWorks blog posts中也注意到了这一点。既然你提到必须这样做几千次,你可能会注意到有所不同,在这种情况下我会首先尝试x = x(x~=0);
。
警告:请注意您是否使用非整数。例如,如果您想要考虑的非常小的数字足够接近零以便将其删除,则上述代码不会将其删除。仅删除完全零。以下内容将帮助您将“足够接近”的数字删除为零:
tolerance = 0.0001; % Choose a threshold for "close enough to zero"
x(abs(x) <= tolerance) = [];
答案 1 :(得分:11)
只是为了与众不同:
x=x(x~=0);
或
x=x(abs(x)>threshold);
这也是处理复杂数字的好处
答案 2 :(得分:11)
这是三种常见的解决方案。它有助于看到差异。
x = round(rand(1,15000));
y = x;
tic,y(y==0) = [];toc
Elapsed time is 0.004398 seconds.
y = x;
tic,y = y(y~=0);toc
Elapsed time is 0.001759 seconds.
y = x;
tic,y = y(find(y));toc
Elapsed time is 0.003579 seconds.
正如您应该看到的,最便宜的方式是直接逻辑索引,选择要保留的元素。查找更加昂贵,因为matlab找到这些元素,返回它们的列表,然后索引到向量中。
答案 3 :(得分:3)
这是另一种方式
y = x(find(x))
我会留给你来弄清楚你尝试的各种方法的相对效率 - 写下来然后让我们都知道。
答案 4 :(得分:2)
虽然我的计时结果并不能确定它是否明显更快,但这似乎是最快最简单的方法:
y = nonzeros(y)
答案 5 :(得分:0)
x = [0 0 0 1 1 0 5 0 7 0]
y = [0 2 0 1 1 2 5 2 7 0]
然后可以获得x2和y2:
x2=x(~(x==0 & y==0))
y2=y(~(x==0 & y==0))
x2 = [0 1 1 0 5 0 7]
y2 = [2 1 1 2 5 2 7]
希望这有帮助!