首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有效地从(非稀疏)矩阵中删除零?

如何有效地从(非稀疏)矩阵中删除零?
EN

Stack Overflow用户
提问于 2009-04-10 18:23:59
回答 6查看 63.5K关注 0票数 11

我有一个矩阵:

代码语言:javascript
复制
x = [0 0 0 1 1 0 5 0 7 0];

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

代码语言:javascript
复制
x = [1 1 5 7];

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-04-10 18:26:31

一种方法:

代码语言:javascript
复制
x(x == 0) = [];

关于时间的注释:

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

警告:如果您使用的是非整数,请注意。例如,如果你有一个非常小的数字,你希望它足够接近于零,这样它就会被删除,上面的代码不会删除它。只有精确的零被删除。下面的代码还将帮助您将“足够接近”的数字删除为零:

代码语言:javascript
复制
tolerance = 0.0001;  % Choose a threshold for "close enough to zero"
x(abs(x) <= tolerance) = [];
票数 16
EN

Stack Overflow用户

发布于 2009-04-10 18:36:59

只是为了与众不同:

代码语言:javascript
复制
x=x(x~=0);

代码语言:javascript
复制
x=x(abs(x)>threshold);

这也有处理复数的好处。

票数 11
EN

Stack Overflow用户

发布于 2009-04-10 21:03:11

这是三种常见的解决方案。这有助于看到不同之处。

代码语言:javascript
复制
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查找这些元素,返回一个列表,然后索引到向量中。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/738438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档