根据您对任务的看法,这里有两种不同的方法
到第二个矩阵中每一行的最小距离
有两种方法来看待这个问题:(1) 中A
每个点的最近点B
,或 (2) 中B
每个点的最近点A
。
最近的点在A
对于每个点,B
您可以找到最近的点A
(例如欧几里得距离),如评论中所要求的:
% Calculate all MxN high-dimensional (3D space) distances at once
distances = squeeze(sum(bsxfun(@minus,B,permute(A,[3 2 1])).^2,2));
% Find closest row in A for each point in B
[~,ik] = min(distances,[],2)
B
制作一个包含这些最近点的大小的数组A
:
Anew = A(ik,:)
只要 in 中的每个点都与 in 匹配,这将隐式地丢弃与 inA
点太远的任何点。如果 中的每个点在中不一定有“匹配”(在可接受距离处的点),则有必要根据 主动拒绝点,从而导致输出短于。这个解决方案似乎超出了范围。B
B
A
B
A
distances
B
最近的点在B
A
计算从 in 中的每个点(行)到 in中的每个点的欧几里得距离,B
并确定 中的最近点B
:
distances = squeeze(sum(bsxfun(@minus,A,permute(B,[3 2 1])).^2,2));
[~,ik] = min(distances,[],2)
A
制作一个包含这些最近点的大小的数组B
:
Anew = B(ik,:)
这种方法中的大小Anew
与 相同A
。
合并第一个矩阵中的相似点
另一种方法是使用未记录的_mergesimpts
函数。
考虑这个测试数据:
>> B = randi(5,4,3)
B =
1 4 4
2 3 4
1 3 4
3 4 5
>> tol = 0.001;
>> A = repmat(B,3,1) + tol * rand(size(B,1)*3,3)
A =
1.0004 4.0005 4.0000
2.0004 3.0005 4.0008
1.0004 3.0009 4.0002
3.0008 4.0005 5.0004
1.0006 4.0004 4.0007
2.0008 3.0007 4.0004
1.0009 3.0007 4.0007
3.0010 4.0005 5.0004
1.0002 4.0003 4.0007
2.0001 3.0001 4.0007
1.0007 3.0006 4.0004
3.0001 4.0003 5.0000
A
根据指定的容差合并相似的行, tol
:
>> builtin('_mergesimpts',A,tol,'average')
ans =
1.0004 4.0004 4.0005
1.0007 3.0007 4.0005
2.0005 3.0005 4.0006
3.0006 4.0004 5.0003
合并相似的行,B
用于获取预期的数字
>> builtin('_mergesimpts',[A; B],tol,'first')
ans =
1 3 4
1 4 4
2 3 4
3 4 5