假设我有两组矩阵(A和B),每个矩阵内包含几个点坐标,我想找出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];
谢谢您的帮助。
假设我有两组矩阵(A和B),每个矩阵内包含几个点坐标,我想找出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];
谢谢您的帮助。
这个问题并没有一个确切的解决方案,例如(一维,但可扩展为 ND)的情况:
A= [1; 3];
B= [2];
然后要么 要么A(1)
可以A(2)
是剩余点。你的算法吐出哪一个,将取决于它是如何工作的,即你首先采取哪个点来找到最近的点。
这种算法包括imo
A(i)
查找和的每个组合之间的距离B(j)
。如果您有统计工具箱,pdist2会为您执行此操作:
A=[ 1 2; 3 4];
B=[1 3; 5 6; 2 1];
dist = pdist2(A,B);
循环遍历最小的A
or B
(我将采用 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));
将结果组合到您想要的输出矩阵C
和D
:
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));
请注意,此代码也适用于 1D 点或更高 (ND) 点,将pdist2
所有内容展平为标量距离。
这是我对这个问题的看法:
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), :)}
该解决方案假设
A
和B
A
始终是源(即,所有内容都与 进行比较A
)如果这些假设不(总是)成立,您将不得不采取更通用的方法,例如@GuntherStruyf 建议的方法。