2012-12-10 78 views
1

我想優化我的代碼,我不知道如何以及如果我能夠矢量化這個特定的部分?MATLAB - 矢量化包含距離度量的雙循環

for base_num = 1:base_length 
    for sub_num = 1:base_length 
    dist{base_num}(sub_num) = sqrt((x(base_num) - x(sub_num))^2 + (y(base_num) - y(sub_num))^2); 
    end 
end 

回答

1

以下示例提供矢量化的一個方法:

%# Set example parameters 
N = 10; 
X = randn(N, 1); 
Y = randn(N, 1); 

%# Your loop based solution 
Dist1 = cell(N, 1);  
for n = 1:N 
    for m = 1:N 
     Dist1{n}(m) = sqrt((X(n) - X(m))^2 + (Y(n) - Y(m))^2); 
    end 
end 

%# My vectorized solution 
Dist2 = sqrt(bsxfun(@minus, X, X').^2 + bsxfun(@minus, Y, Y').^2); 
Dist2Cell = num2cell(Dist2, 2); 

快速速度測試在N = 1000具有運行兩個數量級比循環溶液更快矢量化的解決方案。

注意:我在向量化解決方案中使用了第二行來模仿您的單元格數組輸出結構。由你決定是否要包括它或兩個結合成一條線等。

順便說一句,在問題中發佈代碼+1。但是,對於未來的兩點小建議:1)發佈到SO時,使用簡單的變量名 - 尤其是循環下標 - 例如我的答案。 2)當我們可以將示例代碼直接複製並粘貼到腳本中並運行而無需進行任何更改或添加(如在我的答案中)時,這很好。這使我們能夠更快地融合解決方案。

+0

感謝您的快速響應!我在每個單元格中創建一個帶有向量的單元陣列的原因是'N'變量是可調整的,因此我不知道需要多少個向量。如果這有什麼意義? – user1878019

+0

@ user1878019沒有probs。如果您認爲我的回答是令人滿意的,那麼隨時用標記標記回答。否則,請告訴我是否有任何問題,我會盡力改進答案。 **編輯:**是的,這是有道理的,我會更新我的回答 –

+0

@ user1878019嗯......你的意思是'X'和'Y'的長度是'T',有時候' T'將等於'N',但有時候'T'可能會大於'N'?另外,在開始循環之前,你知道'N' *的值嗎? –