我想验证一个元素是否存在于MATLAB矩阵中。
在开始时,我实现如下:
if ~isempty(find(matrix(:) == element))这显然很慢。因此,我改为:
if sum(matrix(:) == element) ~= 0但是这又是慢的:我调用了很多次包含这个指令的函数,每次我损失了14秒!
有没有进一步优化这个指令的方法?
谢谢。
发布于 2014-12-10 19:00:43
如果您只需要知道一个值是否存在于一个矩阵中,那么使用find的第二个参数来指定您只想要一个值会稍微快一些(25-50%),甚至比使用sum要快一点,至少在我的机器上是这样。举个例子:
matrix = randi(100,1e4,1e4);
element = 50;
~isempty(find(matrix(:)==element,1))但是,在最近版本的Matlab (我使用的是R2014b)中,nnz最终用于此操作的速度更快,因此:
matrix = randi(100,1e4,1e4);
element = 50;
nnz(matrix==element)~=0在我的机器上,对于所提供的示例,这比任何其他方法(包括使用any )都快2.8倍。在我看来,这个解决方案的好处也是最易读的。
发布于 2014-12-10 18:57:18
在我看来,有几件事你可以尝试提高性能:
any进行测试,这是所有的等式测试都成功了:
if any(matrix(:) == element)我在1000×1000矩阵上测试了这个,它比你测试过的解决方案更快。
matrix(:)正在受到惩罚,因为它相当于一个重塑,而Matlab聪明地这样做,因为它不实际分配和移动内存,因为您没有修改临时对象matrix(:)。ismember函数。它可能不是最快的,但对于代码中的非关键部分,它极大地提高了可读性和代码维护(我更愿意花一个小时编写一些需要一天才能运行的代码,而不是花一天时间编写将在一小时内运行的代码(当然,这取决于您使用这个程序的频率,但这是一个人不应该忘记的)。希望这能帮上忙
阿德里安。
https://stackoverflow.com/questions/27407295
复制相似问题