计算 3D 点的距离矩阵
Calculate distance matrix for 3D points
我在 Matlab 中有列表 xA、yA、zA 和列表 xB、yB、zB。包含类型 A 和类型 B 的点的 x、y 和 z 坐标。类型 A 和类型 B 点的数量可能不同。
我想计算一个矩阵,包含A类和B类点之间的欧式距离。当然,我只需要计算矩阵的一半,因为另一半包含重复数据。
最有效的方法是什么?
完成后,我想找到最接近 A 型点的 B 型点。然后如何找到最近、第二近、第三近等的坐标B 类积分?
给定一个大小为 [N,3]
的矩阵 A
和一个大小为 [M,3]
的矩阵 B
,您可以使用 pdist2 函数得到一个矩阵大小 [M,N]
包含所有成对距离。
如果你想根据点到 A
中第 r
点的距离对 B
中的点进行排序,那么你可以对 r
中的第 r
行进行排序成对距离矩阵。
% generate some example data
N = 4
M = 7
A = randn(N,3)
B = randn(M,3)
% compute N x M matrix containing pairwise distances
D = pdist2(A, B, 'euclidean')
% sort points in B by their distance to the rth point in A
r = 3
[~, b_idx] = sort(D(r,:))
然后 b_idx
将包含 B
中的点的 索引 按它们到 r
中第 [=] 个点的距离排序13=]。所以b_idx
排序的B
中的实际点可以用B(b_idx,:)
得到,和B
.
大小一样
如果您想对所有 r
执行此操作,您可以使用
[~, B_idx] = sort(D, 1)
同时对 D
的所有行进行排序。那么 B_idx
的第 r
行将包含 b_idx
.
如果你唯一的 objective 是为 A
中的每个点找到 B
中最近的 k
点(对于一些正整数 k
小于 M
),那么我们通常 而不是 想要计算所有成对距离。这是因为 space-partitioning 类似 K-D-trees 的数据结构可用于提高搜索效率,而无需显式计算所有成对距离。
Matlab 提供了一个 knnsearch
函数,它使用 K-D-trees 来达到这个目的。例如,如果我们做
k = 2
B_kidx = knnsearch(B, A, 'K', k)
那么 B_kidx
将是 B_idx
的前两列,即对于 A
中的每个点,B
中最近的两个点的索引。另外,请注意,当 k
相对较小时,这只会比 pdist2
方法更有效。如果 k
太大,那么 knnsearch
将自动使用之前的显式方法而不是 K-D-tree 方法。
我在 Matlab 中有列表 xA、yA、zA 和列表 xB、yB、zB。包含类型 A 和类型 B 的点的 x、y 和 z 坐标。类型 A 和类型 B 点的数量可能不同。
我想计算一个矩阵,包含A类和B类点之间的欧式距离。当然,我只需要计算矩阵的一半,因为另一半包含重复数据。
最有效的方法是什么?
完成后,我想找到最接近 A 型点的 B 型点。然后如何找到最近、第二近、第三近等的坐标B 类积分?
给定一个大小为 [N,3]
的矩阵 A
和一个大小为 [M,3]
的矩阵 B
,您可以使用 pdist2 函数得到一个矩阵大小 [M,N]
包含所有成对距离。
如果你想根据点到 A
中第 r
点的距离对 B
中的点进行排序,那么你可以对 r
中的第 r
行进行排序成对距离矩阵。
% generate some example data
N = 4
M = 7
A = randn(N,3)
B = randn(M,3)
% compute N x M matrix containing pairwise distances
D = pdist2(A, B, 'euclidean')
% sort points in B by their distance to the rth point in A
r = 3
[~, b_idx] = sort(D(r,:))
然后 b_idx
将包含 B
中的点的 索引 按它们到 r
中第 [=] 个点的距离排序13=]。所以b_idx
排序的B
中的实际点可以用B(b_idx,:)
得到,和B
.
如果您想对所有 r
执行此操作,您可以使用
[~, B_idx] = sort(D, 1)
同时对 D
的所有行进行排序。那么 B_idx
的第 r
行将包含 b_idx
.
如果你唯一的 objective 是为 A
中的每个点找到 B
中最近的 k
点(对于一些正整数 k
小于 M
),那么我们通常 而不是 想要计算所有成对距离。这是因为 space-partitioning 类似 K-D-trees 的数据结构可用于提高搜索效率,而无需显式计算所有成对距离。
Matlab 提供了一个 knnsearch
函数,它使用 K-D-trees 来达到这个目的。例如,如果我们做
k = 2
B_kidx = knnsearch(B, A, 'K', k)
那么 B_kidx
将是 B_idx
的前两列,即对于 A
中的每个点,B
中最近的两个点的索引。另外,请注意,当 k
相对较小时,这只会比 pdist2
方法更有效。如果 k
太大,那么 knnsearch
将自动使用之前的显式方法而不是 K-D-tree 方法。