Max. distance in a bidimensionnal vector
古いコメントを表示
Hi everybody, I'm looking for a solution to find efficiently the longest distance between two elements in a vector, without having to calculate the distance between each element if possible. The vectors are the coordinate on a 2D plan of lines on an image.
I hope I've been clear enough
Thanks
2 件のコメント
Jan
2011 年 2 月 20 日
This is not clear enough. Please specify what "distance between elements in a vector" means. And how can it be possible to find the larges distance without calculating all distances??
Matt Tearle
2011 年 2 月 20 日
Also, how can you have a vector of 2D coordinates? Do you have a 1D cell array of vectors? Or a matrix, or...?
回答 (2 件)
Bruno Luong
2011 年 2 月 20 日
Here is something I wrote for my own use. The code is to prototype an algorithm which I did in C. S it is not speed optimized, but it gives you an idea:
function [d imax jmax] = dmax(X)
% [d imax jmax] = dmax(X)
%
% Compute the largest euclidian distance of a set 2D points
%
% INPUT: X is (npnt x 2)
% OUTPUT: d, largest distance
% imax, jmax, index of two fathest points
MATLABflag=0;
K = myconvhull(X);
X = X(K,:);
npnt = size(X,1);
DX = bsxfun(@minus,X,X(1,:));
dx2 = sum(DX.^2,2);
[dmax2 jmax] = max(dx2);
IMAX = 1;
JMAX = jmax;
nextwrap = [2:npnt 1];
% plot(X([1 jmax],1),X([1 jmax],2),'r');
for i=2:jmax
Xi = X(i,:);
d2 = sum((X(jmax,:)-Xi).^2,2);
while true
next = nextwrap(jmax);
dnext = sum((X(next,:)-Xi).^2,2);
if dnext > d2
d2 = dnext;
jmax = next;
else
break
end
end % while loop
% Keep track of the largest distance
if (d2 > dmax2)
dmax2 = d2;
IMAX = i;
JMAX = jmax;
end
end % for-loop
d = sqrt(dmax2);
imax = K(IMAX);
jmax = K(JMAX);
end % dmax
function K = myconvhull(X)
K = convhull(X);
K(end) = []; % no repeated elements
1 件のコメント
Jan
2011 年 2 月 20 日
If this efficient method really solves the OP's fuzzy formulated problem, you revealed that your crystal ball has magic power.
Matt Tearle
2011 年 2 月 20 日
0 投票
If Bruno's solution is what you want, and you have Statistics Toolbox, you can use pdist to calculate all the pairwise distances, then max to find the biggest (and indexing to find the locations).
カテゴリ
ヘルプ センター および File Exchange で Get Started with MATLAB についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!