我的问题非常简单,但我正在寻找它的矢量化形式。
我的代码是:
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 :(得分:2)
我认为你应该使用pdist
而不是pdist2
。
D = pdist( [Y(:) Z(:)] ); % a compact form
D = squareform( D ); % square m*n x m*n distances.
答案 1 :(得分:1)
我同意Tal Darom,pdist2
正是您需要的功能。它找到两个向量中指定的每对坐标的距离,而不是两个矩阵之间的距离。
所以我很确定在你的情况下你想要这个:
pdist2([Y(:), Z(:)], [Y(:), Z(:)])
矩阵[Y(:), Z(:)]
是由Y-Z定义的2D空间上的每个可能坐标组合的列表。如果您想要一个矩阵,其中包含从每个点到另一个点的距离,那么您必须在此矩阵上调用pdist2
。结果是维度为numel(Y)
x numel(Y)
的二维矩阵,虽然您尚未对其进行定义,但我非常确定Y
和Z
都是{{1} } matrices意为n*m
修改强>
@Shai建议的更正确的解决方案就是使用pdist,因为我们在同一矩阵中比较点:
numel(Y) == n*m
答案 2 :(得分:0)
您可以使用matlab函数pdist2
(我认为它在统计工具箱中),或者您可以在线搜索此函数的开源良好实现。
另外, 看看这个unswer:pdist2 equivalent in MATLAB version 7