11

我有一个矩阵:

x = [0 0 0 1 1 0 5 0 7 0];

我需要删除所有的零,如下所示:

x = [1 1 5 7];

我使用的矩阵很大(1x15000),我需要多次(5000+),所以效率是关键!

4

6 回答 6

16

单程:

x(x == 0) = [];

关于时间的说明:

正如 woodchips 所提到的,与 KitsuneYMG使用的方法相比,这种方法似乎很慢。Loren 在她的一篇 MathWorks 博客文章中也注意到了这一点。由于您提到必须这样做数千次,您可能会注意到不同之处,在这种情况下,我会先尝试。x = x(x~=0);

警告:如果您使用的是非整数,请当心。例如,如果您有一个非常小的数字,您希望将其考虑为足够接近零以便将其删除,则上述代码不会删除它。仅删除精确的零。以下内容将帮助您将“足够接近”的数字删除为零:

tolerance = 0.0001;  % Choose a threshold for "close enough to zero"
x(abs(x) <= tolerance) = [];
于 2009-04-10T18:26:30.830 回答
11

只是要与众不同:

x=x(x~=0);

或者

x=x(abs(x)>threshold);

这也有处理复数的好处

于 2009-04-10T18:36:58.857 回答
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 找到这些元素,返回它们的列表,然后索引到向量中。

于 2009-04-10T21:03:10.640 回答
3

这是另一种方式

y = x(查找(x))

我会留给你来弄清楚你尝试的各种方法的相对效率——写下来让我们都知道。

于 2009-04-10T18:37:35.297 回答
2

虽然我的计时结果不能确定它是否明显更快,但这似乎是最快和最简单的方法:

y = nonzeros(y) 
于 2013-07-23T11:48:07.303 回答
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]

希望这可以帮助!

于 2012-08-09T03:01:58.537 回答