2012-10-09 62 views
4

我正在尋找一種方法來「矢量化」下面的代碼。也就是說,我想擺脫for循環,這需要很長時間(for循環嵌套在另一個for循環中,重複次數超過40,000次)。如何使用多個參數在Matlab中執行「查找」?

for k=1:length 
    if coords(k,1)<=4 && coords(k,2) <=8 
     upperLeft(countUL,:) = coords(k,:); 
     countUL=countUL+1; 
    end 
    if coords(k,1)>4 && coords(k,2) <=8 
     upperRight(countUR,:) = coords(k,:); 
     countUR=countUR+1; 
    end 
    if coords(k,1)>4 && coords(k,2) >8 
     lowerRight(countLR,:) = coords(k,:); 
     countLR=countLR+1; 
    end 
    if coords(k,1)<=4 && coords(k,2) >8 
     lowerLeft(countLL,:) = coords(k,:); 
     countLL=countLL+1; 
    end 
end 

我試圖在第一次使用Matlab的find功能(例如find(coords(k,1)<=4)),但對我來說,我有兩個參數,我需要去「找」。我嘗試了類似find(coords(:,1)<=4 && coords(:,2)<=8)的東西,但由於&&的操作數不是標量,所以這不起作用。任何想法如何做到這一點將不勝感激!

+0

我建議你不要使用'length'作爲變量名(或者也許這是一個錯字) – Jonas

+0

使用Matlab的FEX合併器? http://www.mathworks.com/matlabcentral/fileexchange/8354 – bla

回答

7

&&||只能用於標量比較,因爲您已經注意到了。儘管如此,&|工作在向量上。請注意,你甚至不需要find

idxUL = coords(:,1) <= 4 & coords(:,2) <=8; 
idxUR = coords(:,1) > 4 & coords(:,2) <=8; 

upperLeft = coords(idxUL,:); 
upperRight = coords(idxUR,:); %# etc 
+0

謝謝!我會試試看! – robguinness

+0

@robguinness:我實施了你的建議編輯,它被錯誤地拒絕了。感謝您的發現! – Jonas

+0

沒問題......感謝解決方案! – robguinness

相關問題