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);
4

3 に答える 3

2

私はダンタルに同意しません。

pdistではなく使用する必要があると思いますpdist2

D = pdist( [Y(:) Z(:)] ); % a compact form
D = squareform( D ); % square m*n x m*n distances.
于 2013-02-19T09:35:52.527 に答える
1

Tal Daromに同意しpdist2ます。まさに必要な機能です。2 つの行列間の距離ではなく、2 つのベクトルで指定された座標の各ペアの距離を見つけます。

だから私はあなたの場合、あなたがこれを望んでいると確信しています:

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

行列[Y(:), Z(:)]は、YZ によって定義される 2D 空間で可能なすべての座標の組み合わせのリストです。各ポイントから他の各ポイントまでの距離を含むマトリックスが必要な場合はpdist2、このマトリックス自体を呼び出す必要があります。numel(Y)結果はx次元の 2D 行列でnumel(Y)あり、定義していませんが、 と の両方YZ行列n*mを意味することは確かですnumel(Y) == n*m

編集: @Shai
によって提案されたより正しい解決策は、同じ行列内のポイントを比較しているため、pdist を使用することです。

pdist([Y(:), Z(:)])
于 2013-02-19T09:30:38.170 に答える
0

matlab 関数pdist2(統計ツールボックスにあると思います) を使用するか、この関数のオープン ソースの優れた実装をオンラインで検索できます。

また、この答えを見てください: MATLAB バージョン 7 の pdist2 と同等

于 2013-02-18T22:38:56.227 に答える