# How to find minimal distance between elements?

139 views (last 30 days)
Mr M. on 9 Mar 2018
Commented: aciara on 29 Jan 2021
I have a vector, and I would like to find the minimal distance between element values. Any element distance from any element in the set. Is it possible to do this without a for cycle?
Image Analyst on 10 Mar 2018
Mr. M, you've now asked 311 questions and "Accepted" virtually none of them. Perhaps now you can "thank" the people who took their time to try to help you by Accepting their answers so that they get reputation points. That's the etiquette in this forum. Thanks in advance.

Roger Stafford on 9 Mar 2018
Edited: Roger Stafford on 9 Mar 2018
Let your vector be called v. Then do this:
d = min(diff(sort(v)));
This finds the minimum distance between any two elements of v, but it does not show the points in v where that occurs. To do that requires the use of the index returned as a second output of the 'sort' function as well as an index from the 'min' function. Let us know if that is what you want.
##### 2 CommentsShowHide 1 older comment
Jan on 9 Mar 2018
+1. Sorting at first is the cheapest approach.

Jos (10584) on 9 Mar 2018
Without creating a possibly large intermediate N-ny-N matrix or using a possibly slow sort
V = [1 8 6 4 2 10] ;
W = nchoose2(V) % all pairs of distinct elements
D = abs(W(:,2)-W(:,1)) % distance between pairs
[minD, ix] = min(D) % minD = 1
minPair = W(ix,:) % minPair = [1 2]
nchoose2 is a fast function to get all combinations of two elements, and can be downloaded from the Matlab File Exchange: https://uk.mathworks.com/matlabcentral/fileexchange/20144-nchoose2-x-

Image Analyst on 9 Mar 2018
If the "vector" is actually a matrix of (x,y) locations, you can use pdist2(). Let me know if that's the case and I'll give you an example.
aciara on 29 Jan 2021

Von Duesenberg on 9 Mar 2018
This will get you started:
dumVect = [1 3 5 30]';
[minVal, idxMin] = min(diff(dumVect))
If you work with more dimensions, you may want to use pdist instead of diff. And of course, I'll let you figure out how you want to handle ties.
##### 2 CommentsShowHide 1 older comment
Von Duesenberg on 9 Mar 2018
Oops, you're right.

Jan on 9 Mar 2018
Edited: Jan on 10 Mar 2018
n = 10;
v = rand(1, n);
dist = abs(v - v.'); % Auto-expand since R2016b
dist(1:(n+1):end) = Inf; % Mask the zeros [EDITED]
% dist = bsxfun(@minus, v, v.') .^ 2; % For older versions
[minValue, minIndex] = min(dist(:));
Jan on 15 Mar 2018
@Mr M.: You can simply try it.
v = rand(2,3)
v.'
It is the transpose operator. The quote without the dot before replies the conjugate complex value in addition.

Jos (10584) on 9 Mar 2018
Edited: Jos (10584) on 9 Mar 2018
By definition the minimum distance is zero because v(i)==v(i) for any element i of the vector v.
But I assume you want the minimum distance between v(i) and v(j) for all pairs (i,j) where i is unequal to j, but forgot to mention that ... :p
Mr M. on 14 Mar 2018
yes, of course