我试图找到与候选集最小距离的点。 Z是矩阵,其中行是维度,列表示点。计算点间距离,然后以最小距离和距离记录点。以下是代码段。该代码适用于小维度和小集合点。但是,大数据集需要很长时间(N = 100万个数据点,维度也很高)。有效的方法吗?
答案 0 :(得分:3)
我建议您使用pdist
为您做繁重的工作。此函数将计算阵列中每两个点之间的成对距离。必须使用squareform
将生成的矢量放入矩阵形式,以便找到每对的最小值:
N = 100;
Z = rand(2,N); % each column is a 2-dimensional point
% pdist assumes that the second index corresponds to dimensions
% so we need to transpose inside pdist()
distmatrix = squareform(pdist(Z.','euclidean')); % output is [N, N] in size
% set diagonal values to infinity to avoid getting 0 self-distance as minimum
distmatrix = distmatrix + diag(inf(1,size(distmatrix,1)));
mindists = min(distmatrix,[],2); % find the minimum for each row
sum_dist = sum(mindists); % sum of minimal distance between each pair of points
这计算每对两次,但我认为这适用于您的原始实现。
这个想法是pdist
计算其输入列之间的成对距离。因此,我们将Z
转置为pdist
。由于完整输出始终是具有零对角线的方阵,因此实现pdist
使得它仅在向量中返回对角线上方的值。因此,需要调用squareform
才能获得适当的距离矩阵。然后,必须找到该矩阵的行方向最小值,但首先我们必须排除对角线中的零点。我很懒,所以我将inf
放入对角线,以确保最小值在其他地方。最后,我们只需总结最小距离。