Pdist MATLAB function

I use the pdist command to find the distance between the x and y coordinates stored in the matrix.

X = [100 100; 0 100; 100 0; 500 400; 300 600;]; D = pdist(X,'euclidean') 

Which returns the element vector 15.

 [0.734979755525412 3.40039811339820 2.93175207511321 1.83879677592575 2.40127440268306 2.75251513299386 2.21488402640753 1.10610649500317 1.81674017301699 0.903207751535635 1.99116952754924 1.05069952386082 1.24122819418333 1.08583377275532 1.38729428638035] 

Is there a way to relate these distances to the coordinates from which they were obtained, i.e. save them in a matrix with a common row:

 [Length xcoordinate1 ycoordinate1 xcoordinate2 ycoordinate2] 

Where is the line for each length found?

Thanks in advance

+4
source share
3 answers
 %# define X, D X = [100 100; 0 100; 100 0; 500 400; 300 600;]; D = pdist(X,'euclidean'); %# find the indices corresponding to each distance tmp = ones(size(X,1)); tmp = tril(tmp,-1); %# creates a matrix that has 1 below the diagonal %# get the indices of the 1's [rowIdx,colIdx ] = find(tmp); %# create the output out = [D',X(rowIdx,:),X(colIdx,:)]; 
+7
source

MATLAB has a built-in command called "squareform" that converts pdist output to nxn distance matrix http://www.kxcad.net/cae_MATLAB/toolbox/stats/pdist.html

 %# define X, D X = [100 100; 0 100; 100 0; 500 400; 300 600;]; D = squareform(pdist(X,'euclidean')); 
+12
source

You can use the NCHOOSEK function to generate a set of indices in X and build your matrix as follows:

 >> X = [100 100; 0 100; 100 0; 500 400; 300 600]; %# Your sample data >> D = pdist(X,'euclidean')' %'# Euclidean distance, with result transposed D = 100.0000 %# Note that I get different results than your example! 100.0000 500.0000 538.5165 141.4214 583.0952 583.0952 565.6854 632.4555 282.8427 >> index = nchoosek(1:size(X,1),2); >> M = [DX(index(:,1),:) X(index(:,2),:)] %# [Distance X1 Y1 X2 Y2] M = 100.0000 100.0000 100.0000 0 100.0000 100.0000 100.0000 100.0000 100.0000 0 500.0000 100.0000 100.0000 500.0000 400.0000 538.5165 100.0000 100.0000 300.0000 600.0000 141.4214 0 100.0000 100.0000 0 583.0952 0 100.0000 500.0000 400.0000 583.0952 0 100.0000 300.0000 600.0000 565.6854 100.0000 0 500.0000 400.0000 632.4555 100.0000 0 300.0000 600.0000 282.8427 500.0000 400.0000 300.0000 600.0000 

Note that the NCHOOSEK function will only be a practical solution if the number of columns in X less than about 15.

edit : since pdist selects pairs of points, the nchoosek second nchoosek should just be 2 . It does not depend on the dimension of your data. It also makes an obsolete note in the previous line. (sorry to edit this way, not enough comments to add a comment, but I really liked this answer and I wanted to fix it) - Paul

+1
source

Source: https://habr.com/ru/post/1304562/


All Articles