2016-12-14 3 views
1

Ich bin auf der Suche nach einer Euklidischen Abstandsmatrix von einem Punkt [1,1]. Dies ist, was ich habe, aber es nicht wie vorgesehen:Entfernungen von einem einzigen Punkt

a=rand(10,10); 
a=sort(a); %sort example matrix it should be visible that distances should get bigger and bigger 
a=pdist([ones(size(a));a]); 

Bitte geben Sie die 10x10-Matrix als Bild vorstellen. Ich möchte die Abstände von Punkt A (hier [1,1]) zu einer Reihe anderer Punkte, nämlich der ganzen Matrix, erhalten. Das erwartete Format wäre also die ursprüngliche Matrix 10x10, aber mit allen Entfernungen zu Punkt A.

Gibt es eine einfache Möglichkeit, dies zu tun, die funktioniert?

+0

Wie wollen Sie, dass Sie gehen, den Abstand zwischen einem 10-dimensinal Punkt und einem 2-dimensionalen Punkt berechnen? – Suever

+1

Sie verpassen eine Klammer in der letzten Zeile. – beaker

+0

Also ich dachte für jeden Index [x, y] gibt es einen Wert. Ich will nur, dass dieser Wert die Entfernung von diesem Punkt von [1,1] ist. Macht das mehr Sinn? – user2305193

Antwort

3

Da Ihr ultimatives Ziel mit der Bildverarbeitung zu tun hat, nehme ich an, Sie haben die Bildverarbeitungs-Toolbox. Sie können auch bwdist verwenden und die obere linke Ecke der Eingabe auf true setzen und den Rest ausfüllen lassen. Beachten Sie, dass die Eingabe ein Binärbild ist.

A = false(10, 10); 
A(1, 1) = true; 
B = bwdist(A); 

bwdist berechnet die distance transform wo jede Stelle des Ausgangs gesetzt wird, so dass, wenn die entsprechende Eingabestelle false ist, der Abstand von der Stelle zu den nächsten Nicht-Null-Pixeln berechnet wird. Für Positionen, die true sind, ist die Ausgabe natürlich 0. Da es nur einen Nicht-Null-Pixel in der Eingabe in der oberen linken Ecke gibt, sollte der Rest des Bildes die Entfernung zu diesem Pixel berechnen. Die Standardmethode der Entfernung ist die euklidische Distanz, die Sie suchen.

Beachten Sie auch, dass der zurückgegebene Typ bwdistsingle oder Gleitkommazahl einfacher Genauigkeit ist. Abhängig von Ihrer Anwendung wird die Konvertierung in den vollen double, der standardmäßig der numerische MATLAB-Datentyp ist, bevorzugt. Übergeben Sie einfach den Ausgang mit der double Funktion.

B = double(bwdist(A)); 

Beispiel Run

>> A = false(10, 10); 
>> A(1,1) = true; 
>> B = double(bwdist(A)) 

B = 

     0 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 
    1.0000 1.4142 2.2361 3.1623 4.1231 5.0990 6.0828 7.0711 8.0623 9.0554 
    2.0000 2.2361 2.8284 3.6056 4.4721 5.3852 6.3246 7.2801 8.2462 9.2195 
    3.0000 3.1623 3.6056 4.2426 5.0000 5.8310 6.7082 7.6158 8.5440 9.4868 
    4.0000 4.1231 4.4721 5.0000 5.6569 6.4031 7.2111 8.0623 8.9443 9.8489 
    5.0000 5.0990 5.3852 5.8310 6.4031 7.0711 7.8102 8.6023 9.4340 10.2956 
    6.0000 6.0828 6.3246 6.7082 7.2111 7.8102 8.4853 9.2195 10.0000 10.8167 
    7.0000 7.0711 7.2801 7.6158 8.0623 8.6023 9.2195 9.8995 10.6301 11.4018 
    8.0000 8.0623 8.2462 8.5440 8.9443 9.4340 10.0000 10.6301 11.3137 12.0416 
    9.0000 9.0554 9.2195 9.4868 9.8489 10.2956 10.8167 11.4018 12.0416 12.7279 
+2

Ich habe 'bwdist' komplett vergessen: D – beaker

+0

@beaker: D Dies ist mir nicht eingefallen, bis ich den Kommentar gesehen habe. Das OP möchte nur die Entfernung transformieren. – rayryeng

+0

genial, ich habe die Funktion irgendwie nicht gefunden! Vielen Dank! – user2305193

2

Sie könnten pdist2 verwenden, das zu tun, aber dann würden Sie die Gitterkoordinaten erhalten müssen, die Entfernungen berechnen und sie dann in eine Matrix neu anordnen zurück, so dass ich nur die Entfernung direkt berechnen:

point = [1 1]; % point to calculate distance from 
imgRows = 10; % grid size 
imgCols = 10; 

a = sqrt(([1:imgRows].' - point(1)).^2 + ([1:imgCols] - point(2)).^2); 

Wenn Sie nicht die neueste Version von MATLAB (oder Octave) mit automatischer Sende verwenden, werden Sie stattdessen die bsxfun Version verwenden müssen:

a = bsxfun(@(x,y) sqrt(x.^2 + y.^2), ([1:imgRows] - point(1)).', ([1:imgCols] - point(2))); 

Ergebnis:

a = 

    0.00000 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 
    1.00000 1.41421 2.23607 3.16228 4.12311 5.09902 6.08276 7.07107 8.06226 9.05539 
    2.00000 2.23607 2.82843 3.60555 4.47214 5.38516 6.32456 7.28011 8.24621 9.21954 
    3.00000 3.16228 3.60555 4.24264 5.00000 5.83095 6.70820 7.61577 8.54400 9.48683 
    4.00000 4.12311 4.47214 5.00000 5.65685 6.40312 7.21110 8.06226 8.94427 9.84886 
    5.00000 5.09902 5.38516 5.83095 6.40312 7.07107 7.81025 8.60233 9.43398 10.29563 
    6.00000 6.08276 6.32456 6.70820 7.21110 7.81025 8.48528 9.21954 10.00000 10.81665 
    7.00000 7.07107 7.28011 7.61577 8.06226 8.60233 9.21954 9.89949 10.63015 11.40175 
    8.00000 8.06226 8.24621 8.54400 8.94427 9.43398 10.00000 10.63015 11.31371 12.04159 
    9.00000 9.05539 9.21954 9.48683 9.84886 10.29563 10.81665 11.40175 12.04159 12.72792 
Verwandte Themen