在指定值内限制矩阵的有效方法

时间:2012-08-31 11:51:01

标签: matlab comparison vectorization

我正在开发一个包含数千行代码的大型Matlab测试平台,我正在尝试优化最耗时的例程,这些例程是通过Matlab中的分析器确定的。 我注意到其中一个最耗时的操作如下:

list = list((list(:,1) >= condxMin) & (list(:,1) <= condxMax) & (list(:,2) >= condyMin) & (list(:,2) <= condyMax),:);

具体来说,我有一个很大的坐标列表(至少50000 x 2),我想限制这个列表的值,以便只保留验证这两个条件的点: list(:,1)必须在[condxMin,condxMax]和[condyMin condyMax]中的list(:2)内。

我想知道是否有更有效的方法来实现它,考虑到这行代码已经被矢量化了。 另外,我想知道Matlab是否会发生短路。如果没有,那么我认为有一种方法可以在不破坏矢量化的情况下进行,并使用while循环进行,我会写这样的东西:

j=1;
for i=1:size(list,1)
   if(cond1 && cond2 && cond3 && cond4)
      newlist(j,1:2) = list(i,1:2);
      j=j+1;
   end
end

提前感谢您的回答:)

1 个答案:

答案 0 :(得分:1)

看起来原始的矢量化版本是我能找到的最快的方式,除非有任何非常聪明的想法。 Matlab确实做短路,但不适用于矩阵。你展示的循环实现会非常慢,因为你没有预先分配(也不能预先分配完整的矩阵)。

我尝试了几种变体,包括一个使用短路的&amp;&amp;确定指数是否差,但没有这样的运气。从好的方面来说,你得到的矢量化版本在0.21s时运行500万个元素坐标列表。