首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速检查元素是否在MATLAB矩阵中

快速检查元素是否在MATLAB矩阵中
EN

Stack Overflow用户
提问于 2014-12-10 17:32:47
回答 2查看 491关注 0票数 2

我想验证一个元素是否存在于MATLAB矩阵中。

在开始时,我实现如下:

代码语言:javascript
复制
if ~isempty(find(matrix(:) == element))

这显然很慢。因此,我改为:

代码语言:javascript
复制
if sum(matrix(:) == element) ~= 0

但是这又是慢的:我调用了很多次包含这个指令的函数,每次我损失了14秒!

有没有进一步优化这个指令的方法?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-10 19:00:43

如果您只需要知道一个值是否存在于一个矩阵中,那么使用find的第二个参数来指定您只想要一个值会稍微快一些(25-50%),甚至比使用sum要快一点,至少在我的机器上是这样。举个例子:

代码语言:javascript
复制
matrix = randi(100,1e4,1e4);
element = 50;
~isempty(find(matrix(:)==element,1))

但是,在最近版本的Matlab (我使用的是R2014b)中,nnz最终用于此操作的速度更快,因此:

代码语言:javascript
复制
matrix = randi(100,1e4,1e4);
element = 50;
nnz(matrix==element)~=0

在我的机器上,对于所提供的示例,这比任何其他方法(包括使用any )都快2.8倍。在我看来,这个解决方案的好处也是最易读的。

票数 5
EN

Stack Overflow用户

发布于 2014-12-10 18:57:18

在我看来,有几件事你可以尝试提高性能:

  1. 按照您最初的想法,我将对函数any进行测试,这是所有的等式测试都成功了: if any(matrix(:) == element)

我在1000×1000矩阵上测试了这个,它比你测试过的解决方案更快。

  1. 我不认为展开的matrix(:)正在受到惩罚,因为它相当于一个重塑,而Matlab聪明地这样做,因为它不实际分配和移动内存,因为您没有修改临时对象matrix(:)
  2. 如果您不改变对函数的调用或很少更改,您可以简单地使用包含矩阵所有元素的另一个向量,而是排序。这样,您就可以使用更有效的搜索算法O(log(N))测试元素的存在。
  3. 对于这类问题,我个人喜欢ismember函数。它可能不是最快的,但对于代码中的非关键部分,它极大地提高了可读性和代码维护(我更愿意花一个小时编写一些需要一天才能运行的代码,而不是花一天时间编写将在一小时内运行的代码(当然,这取决于您使用这个程序的频率,但这是一个人不应该忘记的)。
  4. 如果您可以得到矩阵元素的排序副本,可以考虑使用无文档的Matlab函数等元c,但请记住输入必须排序为非稀疏的非NaN值。
  5. 如果性能真的很关键,您可能需要编写自己的mex文件,对于这个任务,您甚至可以使用openmp包括一些简单的并行化。

希望这能帮上忙

阿德里安。

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

https://stackoverflow.com/questions/27407295

复制
相关文章

相似问题

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