我需要运行许多a<0
形式的测试,其中a
是一个向量(相对较短的一个)。我目前正在使用
all(v<0)
有更快的方法吗?
答案 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会执行以下操作:
因此,即使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,而且我还以这种方式表明了这一点)。