2013-02-18 165 views
1

我的問題是相當微不足道的,但我正在尋找它的矢量化形式。計算距離,給定一組座標

我的代碼是:

HubHt = 110; % Hub Height 
GridWidth = 150; % Grid length along Y axis 
GridHeight = 150; % Grid length along Z axis 
RotorDiameter = min(GridWidth,GridHeight); % Turbine Diameter 
Ny = 31; 
Nz = 45; 
%% GRID DEFINITION 

dy = GridWidth/(Ny-1); 
dz = GridHeight/(Nz-1); 
if isequal(mod(Ny,2),0) 
    iky = [(-Ny/2:-1) (1:Ny/2)]; 
else 
    iky = -floor(Ny/2):ceil(Ny/2-1); 
end 

if isequal(mod(Nz,2),0) 
    ikz = [(-Nz/2:-1) (1:Nz/2)]; 
else 
    ikz = -floor(Nz/2):ceil(Nz/2-1); 
end 

[Y Z] = ndgrid(iky*dy,ikz*dz + HubHt); 

編輯

目前我使用這個解決方案,它具有合理的表演:

coord(:,1) = reshape(Y,[numel(Y),1]); 
coord(:,2) = reshape(Z,[numel(Z),1]); 
dist_y = bsxfun(@minus,coord(:,1),coord(:,1)'); 
dist_z = bsxfun(@minus,coord(:,2),coord(:,2)'); 
dist = sqrt(dist_y.^2 + dist_z.^2); 
+0

@Dan:我剛剛編輯了我的問題。老實說,在以前版本的關於我如何定義距離的問題上有一個明顯的缺陷。 – fpe 2013-02-19 08:13:29

+0

@TalDarom是正確的,pdist2是正確的。它聲稱找到兩個矩陣的每個元素 – Dan 2013-02-19 08:46:42

+0

'pdist2'之間的成對距離絕對不是答案:我不知道答案:我不知道不想計算兩個矩陣之間的距離,而是計算網格上點之間的距離,其中'Y'和'Z'代表網格上每個點的笛卡爾座標。 – fpe 2013-02-19 09:04:58

回答

1

我同意Tal Darompdist2正是你所需要的功能。它找出兩個向量中指定的每對座標的距離,而不是兩個矩陣之間的距離。

所以我對你的情況很肯定你想要這個:

pdist2([Y(:), Z(:)], [Y(:), Z(:)]) 

矩陣[Y(:), Z(:)]超過由Y-Z所定義的二維空間的每一個可能的座標組合的列表。如果你想要一個包含從每個點到另一個點的距離的矩陣,那麼你必須在它自己的矩陣上調用pdist2。其結果是,尺寸numel(Y) X numel(Y),儘管你還沒有定義它,我敢肯定,這兩個YZn*m矩陣意味着一個二維矩陣numel(Y) == n*m

編輯:
一個更正確的解決方案的建議@Shai僅僅是因爲我們在同一個矩陣中比較點使用pdist:

pdist([Y(:), Z(:)]) 
+1

按照shai的建議調整爲使用pdist而不是pdist2。這是更正確的。 – Dan 2013-02-19 09:55:36

0

可以使用MATLAB函數pdist2(我認爲它在統計工具箱中),或者你可以在線搜索開源的好玩的實現ction。

此外, 看看這個unswer:pdist2 equivalent in MATLAB version 7

+0

我不想要兩個矩陣之間的距離:我已經知道'pdinst2'。無論如何,我會更好地閱讀它。 – fpe 2013-02-18 22:43:15

2

我不同意DanTal

我相信你應該使用pdist而不是pdist2

D = pdist([Y(:) Z(:)]); % a compact form 
D = squareform(D); % square m*n x m*n distances. 
+0

是的,我同意這一點 - 將更新我的答案反映。 – Dan 2013-02-19 09:52:44