我有一个矩阵:
x = [0 0 0 1 1 0 5 0 7 0];我需要删除所有的零,如下所示:
x = [1 1 5 7];我使用的矩阵很大(1x15000),并且我需要多次这样做(5000+),所以效率是关键!
发布于 2009-04-10 18:26:31
一种方法:
x(x == 0) = [];关于时间的注释:
正如woodchips提到的,与KitsuneYMG使用的方法相比,这种方法似乎很慢。罗兰在她的一篇MathWorks blog posts中也提到了这一点。由于您多次提到必须这样做,您可能会注意到不同之处,在这种情况下,我将首先尝试x = x(x~=0);。
警告:如果您使用的是非整数,请注意。例如,如果你有一个非常小的数字,你希望它足够接近于零,这样它就会被删除,上面的代码不会删除它。只有精确的零被删除。下面的代码还将帮助您将“足够接近”的数字删除为零:
tolerance = 0.0001; % Choose a threshold for "close enough to zero"
x(abs(x) <= tolerance) = [];发布于 2009-04-10 18:36:59
只是为了与众不同:
x=x(x~=0);或
x=x(abs(x)>threshold);这也有处理复数的好处。
发布于 2009-04-10 21:03: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查找这些元素,返回一个列表,然后索引到向量中。
https://stackoverflow.com/questions/738438
复制相似问题