continuous search of the closest rows in a matrix

2 次查看(过去 30 天)
Hello,
Consider a 100x10 matrix and a random row of it, let be "row1".
I want to calculate the Euclidean distance between "row1" and the rest of the rows and I want to find the closest row to "row1", let be "row2".
Then I want to find the closest row to "row2", let be "row3" (the "row1" has been excluded from the matrix) and so on.
I use the "pdist2" for the Euclidean distance.
How you please help me?
Thank you.
Best,
Pavlos
  4 个评论
José-Luis
José-Luis 2013-1-15
Please post what you have done so we can help you accordingly.
pavlos
pavlos 2013-1-15
Here is the code:
%extract a random row from the matrix M 100x10
T = randperm(100);
row1 = M(T(1:1),:);
%remove the row from the matrix
M(T(1),:)=[];
%calculate the distances between M and row1
d1=pdist2(M,row1);
%find the closest row to row1 and the corresponding distance between them
[min_dis ind_min_dis]=min(d1);
row2=T(ind_min_dis,:);
%remove row2 from the matrix
M(ind_min_dis,:)=[];
%continue the same process with a loop
for k=1:length(M)
d(k)=pdist2(M,row(k));
[min_dis(k) ind_min_dis(k)]=min(d(k));
row(k)=M(ind_min_dis(k),:);
M(ind_min_dis(k),:)=[];
end

请先登录,再进行评论。

采纳的回答

Matt J
Matt J 2013-1-15
编辑:Matt J 2013-1-15
Here's what I use. There are others like it on the FEX, some of them fancier.
function Graph=interdists(A,B)
%Finds the graph of distances between point coordinates
%
% (1) Graph=interdists(A,B)
%
% in:
%
% A: matrix whose columns are coordinates of points, for example
% [[x1;y1;z1], [x2;y2;z2] ,..., [xM;yM;zM]]
% but the columns may be points in a space of any dimension, not just 3D.
%
% B: A second matrix whose columns are coordinates of points in the same
% Euclidean space. Default B=A.
%
%
% out:
%
% Graph: The MxN matrix of separation distances in l2 norm between the coordinates.
% Namely, Graph(i,j) will be the distance between A(:,i) and B(:,j).
%
%
% (2) interdists(A,'noself') is the same as interdists(A), except the output
% diagonals will be NaN instead of zero. Hence, for example, operations
% like min(interdists(A,'noself')) will ignore self-distances.
%
% See also getgraph
noself=false;
if nargin<2
B=A;
elseif ischar(B)&&strcmpi(B,'noself')
noself=true;
B=A;
end
N=size(A,1);
B=reshape(B,N,1,[]);
Graph=l2norm(bsxfun(@minus, A, B),1);
Graph=squeeze(Graph);
if noself
n=length(Graph);
Graph(linspace(1,n^2,n))=nan;
  7 个评论

请先登录,再进行评论。

更多回答(1 个)

Teja Muppirala
Teja Muppirala 2013-1-16
If you have the Statistics Toolbox installed, instead of using PDIST2, use PDIST (along with SQUAREFORM) instead. It is designed to find all interpoint distances for a single matrix very efficiently. Then your entire problem could be reduced to this:
M = randn(100,10);
L = size(R,1);
D = squareform(pdist(M));
D(1:L+1:L^2) = nan;
startrow = 1; % Starting Row
row = [startrow; zeros(L-1,1)];
for n = 2:L
oldrow = startrow;
[val,startrow] = min(D(:,startrow));
D(oldrow,:) = nan;
row(n) = startrow;
end
row

类别

Help CenterFile Exchange 中查找有关 Statistics and Machine Learning Toolbox 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by