找到两组矩阵之间的最近点对

时间:2012-08-23 01:13:34

标签: matlab nearest-neighbor

假设我有两组矩阵( A B ),每个矩阵里面包含几个点坐标,我想找出 B <中的点/ strong>最接近 A 并输出一个单元格数组 C 相应地列出了最近的点对坐标,一个单元格数组 D 注册了不成对的点,我应该怎么做?

更具体地说,这就是我想要的

两组矩阵包含点xy坐标;

A=[ 1 2; 3 4]; B=[1 3; 5 6; 2 1];

希望获得C{1,1}=[1 2; 1 3]; C{2,1}= [3 4; 5 6]; D{1,1}=[2 1];

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

这个问题没有一个解决方案,例如(一维,但可扩展到N-D)案例:

A= [1; 3];
B= [2];

然后A(1)A(2)可以作为剩余点。你的算法吐出哪一个,将取决于它是如何工作的,即你首先找到最近的点。

这种算法由

组成
  1. 查找A(i)B(j)的每个组合之间的距离。如果您有统计工具箱,pdist2会为您执行此操作:

    A=[ 1 2; 3 4];
    B=[1 3; 5 6; 2 1];
    dist = pdist2(A,B);
    
  2. 在最小的AB上循环(我会选择A,因为它在您的示例中最小)并找到最近的A中的每个点指向剩余的B集:

    N = size(A,1);
    matchAtoB=NaN(N,1);
    for ii=1:N
        dist(:,matchAtoB(1:ii-1))=Inf; % make sure that already picked points of B are not eligible to be new closest point
        [~,matchAtoB(ii)]=min(dist(ii,:));
    end
    matchBtoA = NaN(size(B,1),1);
    matchBtoA(matchAtoB)=1:N;
    remaining_indices = find(isnan(matchBtoA));
    
  3. 将结果与所需的输出矩阵CD合并:

    C=arrayfun(@(ii) [A(ii,:) ; B(matchAtoB(ii),:)],1:N,'uni',false);
    D=mat2cell(B(remaining_indices,:),ones(numel(remaining_indices),1),size(B,2));
    
  4. 请注意,此代码也适用于1D点或更高(N-D),pdist2将所有内容展平为标量距离。

答案 1 :(得分:0)

以下是我对这个问题的看法:

A=[1 2
   3 4]; 

B=[1 3
   5 6
   2 1];

dists = pdist2(A,B);

[dists, I] = sort(dists,2);

c = NaN(size(A,1),1);
for ii = 1:size(A,1)    
    newC = find(~any(bsxfun(@eq, I(ii,:), c), 1));
    c(ii) = I(ii,newC(1));
end

C = cellfun(@(x)reshape(x,2,2).',...
        mat2cell([A B(c,:)], ones(size(A,1),1), 4), 'uni', false);
D = {B(setdiff(1:size(B,1),c), :)}

此解决方案假设

  • 你所有的矢量都是2D
  • 堆叠成AB
  • A始终是来源(即,所有内容都与A进行比较)

如果这些假设没有(总是)成立,你将不得不采取更一般的方法,就像@GuntherStruyf建议的那样。