2013-01-23 24 views
7

Ho una regione con circa 144 punti. Quello che voglio ottenere è misurare la distanza di un punto con tutti gli altri e memorizzarlo in un array. Voglio farlo per tutti i punti. Se possibile, vorrei memorizzare questi dati in modo che non ci siano ripetizioni. E dovrei essere in grado di fare domande come ... Tutte le distanze tra tutti i punti senza ripetizione, somma di tutte le distanze per il punto no56 ecc.Calcolo della distanza di tutti i punti di una regione tra loro

Ho un array 3 * 144 con due colonne che memorizzano le coordinate dei punti .

+0

ho appena notato questa domanda e volevo dare un collegamento a [questa risposta con un confronto di tre metodi per calcolare la distanza a coppie in MATLAB] (http://stackoverflow.com/a/19456458/2778484). L'altra domanda è terribilmente confusa, ma la risposta risolve le distanze a coppie, l'ultimo metodo in qualsiasi dimensione. – chappjc

risposta

6

Una possibile soluzione (io non sono veramente chiaro con cosa si intende per nessuna ripetizione, però):

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) 

così

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

, naturalmente, la matrice è simmetrica. Puoi facilmente ridurre la complessità implicata.

+0

Per ripetizione intendevo che il punto di forma della distanza da A a B è lo stesso di B a A, quindi non dovrebbe essere considerato. – Vikram

+0

@Vikram, a destra, la matrice è davvero simmetrica. A proposito, per un piccolo numero di punti (come 144), probabilmente questo approccio più brute-force-like è in qualche modo più veloce di metodi più intelligenti. Basta fare un tentativo. – Acorbe

2

Diciamo che il vostro array è A, dove ogni colonna memorizza le coordinate di un singolo punto. Per ottenere le combinazioni di tutte le coppie di punti (senza ripetizioni), utilizzare nchoosek:

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

quindi calcolare il Euclidean distance in questo modo:

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

se avete la Statistics Toolbox installato, è possibile utilizzare pdist(A), invece, per lo stesso effetto.

+0

Ho la funzione pdist. Che cosa rappresenta il [4] in [pdist (A)] [4]? – Vikram

+0

@Vikram è solo un errore di battitura (ho provato a creare un collegamento ipertestuale alla documentazione ufficiale di 'pdist'). Dovrebbe essere 'pdist (A)'. Fisso. –

1

Se hai la casella degli strumenti statistici, e se si dispone di tutti i dati nella matrice X, quindi

D = pdist(X) 

dà tutte le distanze a coppie tra tutti i punti di X.

+0

La soluzione più semplice se si può convivere con una matrice triangolare anziché con una matrice di distanze simmetrica (sebbene ['squareform'] (http://www.mathworks.com/help/stats/squareform.html) possa farti arrivare fino in fondo) . +1 Per riferimento, vedere [risposta di questo altro post per un confronto di 'pdist' e altre soluzioni" manuali ""] (http://stackoverflow.com/a/19456458/2778484). – chappjc

Problemi correlati