2013-01-23 10 views
7

Mam region z około 144 punktami. To, co chcę osiągnąć, to zmierzyć odległość punktu ze wszystkimi innymi i zapisać go w tablicy. Chcę to zrobić dla wszystkich punktów. Jeśli to możliwe, chciałbym przechowywać te dane w taki sposób, aby nie występowały w nich powtórzenia. I powinienem być w stanie tworzyć zapytania takie jak: - Wszystkie odległości między wszystkimi punktami bez powtórzeń, suma wszystkich odległości dla punktu no56 itd.Obliczanie odległości wszystkich punktów w regionie między sobą

Mam tablicę 3 * 144 z dwiema kolumnami przechowującymi współrzędne punktów .

+0

Właśnie zauważyłem to pytanie i chciał dać link do [tej odpowiedzi z porównaniem trzech metod obliczania odległości parami w MATLAB] (http://stackoverflow.com/a/19456458/2778484). Drugie pytanie jest strasznie mylące, ale odpowiedź dotyczy odległości parami, ostatniej metody w dowolnym wymiarze. – chappjc

Odpowiedz

6

Możliwym rozwiązaniem (nie jestem bardzo jasne, z tym, co masz na myśli bez powtórzeń, chociaż):

X are your points with coordinates x = X(:,1), y = X(:,2) 


dist = sqrt(bsxfun(@minus,X(:,1),X(:,1)').^2 + bsxfun(@minus,X(:,2),X(:,2)').^2) 

tak

dist(i,j) is the euclidean distance between i and j 

oczywiście macierz jest symetryczna. Możesz łatwo zmniejszyć złożoność.

+0

Przez powtarzanie oznaczało to, że odległość od punktu A do B jest taka sama jak w przypadku od B do A, więc nie należy go uwzględniać. – Vikram

+0

@Vikram, Z prawej, macierz jest rzeczywiście symetryczna. Nawiasem mówiąc, dla niewielkiej liczby punktów (jak 144), prawdopodobnie to podejście bardziej brutalne-życie jest jakoś szybsze niż mądrzejsze metody. Po prostu daj temu szansę. – Acorbe

2

Załóżmy, że twoja tablica to A, gdzie każda kolumna przechowuje współrzędne jednego punktu. Aby uzyskać kombinacje wszystkich par punktów (bez powtórzeń), użyj nchoosek:

pairs = nchoosek(1:size(A, 2), 2) 

następnie obliczyć Euclidean distance tak:

dist = sqrt(sum((A(:, pairs(:, 1)) - A(:, pairs(:, 2))) .^ 2, 1)) 

Jeśli zainstalowano Statistics Toolbox można użyć pdist(A) zamiast na ten sam efekt.

+0

Mam funkcję pdist. Co zawiera [4] w [pdist (A)] [4]? – Vikram

+0

@Vikram to tylko błąd literowy (próbowałem utworzyć hiperłącze do oficjalnej dokumentacji 'pdist'). Powinien to być 'pdist (A)'. Naprawiony. –

1

Jeśli masz przybornika statystyki, a jeśli masz wszystkie dane w tablicy X, następnie

D = pdist(X) 

daje wszystkie parami odległości między wszystkimi punktami w X.

+0

Najprostszym rozwiązaniem, jeśli możesz żyć z trójkątną matrycą zamiast symetrycznej macierzy odległości (chociaż ['squareform'] (http://www.mathworks.com/help/stats/squareform.html) może Cię wciągnąć) . +1 Dla odniesienia, zobacz [odpowiedź tego innego posta dla porównania 'pdist' i innych" ręcznych "rozwiązań"] (http://stackoverflow.com/a/19456458/2778484). – chappjc

Powiązane problemy