在MATLAB中更快速地测试条件

时间:2014-11-10 15:17:18

标签: performance matlab

我需要运行许多a<0形式的测试,其中a是一个向量(相对较短的一个)。我目前正在使用

all(v<0)

有更快的方法吗?

2 个答案:

答案 0 :(得分:2)

不确定哪一个会更快(可能取决于机器和Matlab版本),但这里有all(v<0)的替代方案:

~any(v>0)
nnz(v>=0)==0 %// Or ~nnz(v>=0)
sum(v>=0)==0 %// Or ~sum(v>=0)
isempty(find(v>0, 1)) %// Or isempty(find(v>0))

答案 1 :(得分:1)

我认为问题在于先在数组的所有元素上执行条件,然后再测试条件...也就是说,对于测试“ any(v <0)”,matlab会执行以下操作:

  1. 步骤1:为v的每个元素计算v <0
  2. 第2步:在第1步的结果中搜索一个真值

因此,即使v的第一个元素小于零,也会先为所有元素计算条件,因此浪费了大量时间。我认为以上提供的任何替代解决方案也是如此。

我不知道一种更轻松的方式轻松完成此操作,但希望我做到了。在某些情况下,将阵列v分成较小的块并进行增量测试可以加快处理速度,特别是在这种情况很普遍的情况下。例如:

function result = anyLessThanZero(v);
w = v(:);
result = true;
for i=1:numel(w)
   if ( w(i) < 0 ) 
      return;
   end
end
result = false;
end

,但是如果这种情况很少发生,那么效率可能非常低。 (如果要真正做到这一点,可能有比我上面说明的更好的方法来处理任何条件,不仅是<0,而且我还以这种方式表明了这一点)。