2013-02-18 127 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