Montag, Januar 27, 2020

Entfernung berechnen, da eine Reihe von Koordinaten

meine Frage ist ziemlich trivial, aber ich bin auf der Suche nach der vektorisierter form.

Mein code ist:

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

BEARBEITEN

Zurzeit bin ich mit dieser Lösung, die angemessene Leistungen:

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);
  • Ich habe gerade bearbeitete meine Frage wieder. Mal ehrlich, es war offensichtlich ein Fehler in der vorherigen Ausgabe der Frage nach, wie ich die definieren wollen Abstand.
  • richtig ist, pdist2 korrekt ist. link aus der docs, die es behauptet zu finden, die den paarweisen Abstand zwischen den einzelnen Elementen von 2-Matrizen
  • pdist2 ist absolut nicht die Antwort: ich will nicht zur Berechnung der Entfernung zwischen zwei Matrizen, aber die Distanz zwischen den Punkten auf dem Gitter, wo Y und Z sind Vertreter der kartesischen Koordinaten von jedem Punkt auf dem Gitter.
  • pdist2 ist absolut die Antwort – ich sage nicht, pdist2(Y, Z) ist anzwer aber pdist2 ist die Funktion. Siehe meine Antwort für was Argumente zu übergeben. Es nicht die Distanz zwischen 2-Matrizen, die es findet, der Abstand zwischen jeden zwei-Punkt-Kombinationen aus zwei Listen von Vektoren, die in Ihrem Fall werden die gleichen 2 sind, die sind nur Y und Z abgeflacht und concatened.
InformationsquelleAutor fpe | 2013-02-18

3 Kommentare

  1. 1

    Ich Stimme mit Tal Darom, pdist2 ist genau die Funktion, die Sie brauchen. Er findet den Abstand für jedes paar von Koordinaten angegeben, die in zwei Vektoren und NICHT die Entfernung zwischen zwei Matrizen.

    So, ich bin mir ziemlich sicher, dass in Ihrem Fall, Sie möchten diese:

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

    Matrix [Y(:), Z(:)] ist eine Liste von allen möglichen koordinieren Kombination über den 2D-Raum definiert durch Y-Z. Wenn Sie möchten, eine matrix mit der Entfernung von jedem Punkt zu jedem anderen Punkt, dann müssen Sie rufen Sie pdist2 auf dieser matrix mit sich selbst. Das Ergebnis ist eine 2D-matrix mit den Dimensionen numel(Y) x numel(Y) und obwohl Sie nicht definiert, ich bin mir ziemlich sicher, dass beide Y und Z sind n*m Matrizen Bedeutung numel(Y) == n*m

    EDIT:

    Eine korrekte Lösung von @Shai ist nur zu verwenden, pdist, da vergleichen wir Punkte innerhalb der gleichen matrix:

    pdist([Y(:), Z(:)])
    • Angepasst zu verwenden pdist eher als pdist2 wie vorgeschlagen von shai. Dies ist korrekt.
  2. 2

    Ich bin nicht einverstanden mit Dan und Tal.

    Glaube ich, sollten Sie verwenden pdist eher als pdist2.

    D = pdist( [Y(:) Z(:)] ); % a compact form
    D = squareform( D ); % square m*n x m*n distances.
    • Ja, ich Stimme mit dieser – aktualisieren meine Antwort zu reflektieren.
  3. 0

    Können Sie die matlab-Funktion pdist2 (ich denke, es ist in der statistics toolbox) oder Sie können die online-Suche für open-source-gute Implementierungen dieser Funktion.

    Auch,
    Blick auf diese unswer: pdist2 entspricht im MATLAB-version 7

    • Ich will nicht, dass die Distanz zwischen den beiden Matrizen: ich weiß schon pdinst2. Ich werde sowieso einen besseren Lesen, um es.

Kostenlose Online-Tests