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

标签 matlab nearest-neighbor

假设我有两组矩阵(AB),每个矩阵中包含几个点坐标,我想找出B 最接近 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];

感谢您的帮助。

最佳答案

这个问题没有一个解决方案,例如(一维,但可扩展到 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,因为它在您的示例中是最小的)并找到 中的每个点code>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));
    

请注意,此代码也适用于一维或更高 (N-D) 点,pdist2 将所有内容展平为标量距离。

关于matlab - 找到两组矩阵之间最近的点对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12083467/

相关文章:

matlab - 绘制没有显式变量名的匿名函数

Matlab 3D 插值

python - 绘制具有 8 个特征的 k-最近邻图?

python - 机器学习标准化的目的是什么?

python - 用莫顿代码找到最近的邻居

matlab - matlab中的余弦相似度内置函数

python - 将 numpy 数组用于整数和数组输入

java - KD树——最近邻算法

sql - 错误 : subquery in FROM cannot refer to other relations of same query level

algorithm - 获取 MATLAB 向量的子集