6

我正在开发一个包含数千行代码的大型 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

提前感谢您的回答:)

4

1 回答 1

1

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

我对此尝试了几种变体,包括一个使用短路 && 来确定索引是否坏的 for 循环,但没有这样的运气。从好的方面来说,对于 500 万个元素坐标列表,您获得的矢量化版本的运行时间为 0.21 秒。

于 2012-08-31T12:24:10.013 回答