How to find minimal distance between elements?

조회 수: 11 (최근 30일)
Mr M.
Mr M. 2018년 3월 9일
댓글: aciara 2021년 1월 29일
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?
  댓글 수: 1
Image Analyst
Image Analyst 2018년 3월 10일
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
Roger Stafford 2018년 3월 9일
편집: Roger Stafford 2018년 3월 9일
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
Guillaume
Guillaume 2018년 3월 9일
Indeed, as long as we're talking about a vector of numbers, this is the most efficient. To get the original indices of the two closest numbers:
v = randi(1000, 1, 10) %demo data
[sorted, originalidx] = sort(v);
[mindistance, where] = min(diff(sorted));
closestindex = originalidx([where, where+1]);
fprintf('elements at index %d and %d have got the minimum distance of %d\n', closestindex, mindistance)
Jan
Jan 2018년 3월 9일
+1. Sorting at first is the cheapest approach.

댓글을 달려면 로그인하십시오.

추가 답변 (5개)

Jos (10584)
Jos (10584) 2018년 3월 9일
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
Image Analyst 2018년 3월 9일
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.
  댓글 수: 3
Image Analyst
Image Analyst 2021년 1월 29일
numPoints = 7;
xy1 = rand(numPoints, 2);
xy2 = rand(numPoints, 2);
distances = pdist2(xy1, xy2);
% Set 0's to inf since we don't want to find the min
% distance of a point to itself, which is 0.
distances(distances==0) = inf
% Find min distance
minDistance = min(distances(:))
% Find row and column where it occurs.
[row1, row2] = find(distances == minDistance)
% Plot all points
plot(xy1(:, 1), xy1(:, 2), 'r.', 'MarkerSize', 30); % Plot set 1.
hold on;
plot(xy2(:, 1), xy2(:, 2), 'b.', 'MarkerSize', 30); % Plot set 1.
% Plot the line
x1 = xy1(row1, 1);
y1 = xy1(row1, 2);
x2 = xy2(row2, 1);
y2 = xy2(row2, 2);
plot([x1, x2], [y1, y2], 'k-', 'LineWidth', 2);
grid on;
legend('Set 1', 'Set 2', 'Closest Pair');
caption = sprintf('Min Distance = %.4f', minDistance);
title(caption, 'fontSize', 20);
Please vote for my Answer if it helped you.
aciara
aciara 2021년 1월 29일
Thank you!! Very helpful

댓글을 달려면 로그인하십시오.


Von Duesenberg
Von Duesenberg 2018년 3월 9일
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
Jan
Jan 2018년 3월 9일
This is the minimal distance between neighboring elements, not between all elements.
Von Duesenberg
Von Duesenberg 2018년 3월 9일
Oops, you're right.

댓글을 달려면 로그인하십시오.


Jan
Jan 2018년 3월 9일
편집: Jan 2018년 3월 10일
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(:));
  댓글 수: 4
Mr M.
Mr M. 2018년 3월 14일
What is this? v.'
Jan
Jan 2018년 3월 15일
@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)
Jos (10584) 2018년 3월 9일
편집: Jos (10584) 2018년 3월 9일
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

카테고리

Help CenterFile Exchange에서 Deep Learning Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by