use*_*514 6 comparison matlab vectorization
我正在开发一个包含数千行代码的大型Matlab测试平台,我正在尝试优化最耗时的例程,这些例程是通过Matlab中的分析器确定的.我注意到其中一个最耗时的操作如下:
list = list((list(:,1) >= condxMin) & (list(:,1) <= condxMax) & (list(:,2) >= condyMin) & (list(:,2) <= condyMax),:);
Run Code Online (Sandbox Code Playgroud)
具体来说,我有一个很大的坐标列表(至少50000 x 2),我想限制这个列表的值,以便只保留验证这两个条件的点:list(:,1)必须在[ condxMin,condxMax]和[condyMin condyMax]中的列表(: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
Run Code Online (Sandbox Code Playgroud)
提前谢谢你的回答:)
看起来原始的矢量化版本是我能找到的最快的方法,除非有任何真正聪明的想法。Matlab 确实可以进行短路处理,但不适用于矩阵。您展示的循环实现会非常慢,因为您没有预分配(也无法预分配完整的矩阵)。
我尝试了一些变体,包括一个 for 循环,它使用短路 && 来确定索引是否不好,但没有这样的运气。从好的方面来说,您获得的矢量化版本对于 500 万个元素坐标列表的运行速度为 0.21 秒。