如何计算两片点云的欧氏距离
假设第一片点云为
第二
因为点云在计算中一般使用批处理(batching),所以不妨假设两片点云的分别被分成了两批次.请注意如果将点云分为两个批次进行处理,那么在每个批次中,只会计算该批次内的点云之间的距离。这意味着第一个批次中的点云与第二个批次中的点云之间的距离不会被计算。
对于点云数据这样的张量,
其形状 [B, N, C],
B - 批次大小(Batch Size),N - 点的数量,C - 坐标或特征的维度
为了计算每个点与另一个点集中的每个点之间的欧几里得距离的平方,我们已经知道,欧几里得距离的平方公式是:
所以将距离公式分为三部分(各自平方和以及乘积)
1,首先使用矩阵乘法将两片点云([B, N, C]
和 [B, C, M]
)相乘,但为使它们能够相乘,必须对其中一片点云进行转置(将第二片点云转置为[B, M, C])
2,然后在进行矩阵相乘,并且在相乘的情况下再乘-2.
3,计算每个点的坐标的平方和。这意味着我们取每个点的x、y、z坐标,分别平方它们,然后将它们加在一起。
这是由于PyTorch(以及其他像NumPy这样的库)中的广播机制。广播允许在形状不完全匹配的张量上执行元素级操作。
要理解广播,有几个基本的原则:
如果两个张量的维度数不同,小维度张量的形状会在最左边用1补齐。
在任何维度上,大小为1的维度会被拉伸或复制以匹配另一个张量的大小。
如果在任何维度上两个张量的大小不匹配且其中一个张量在该维度上的大小不为1,将引发错误。
考虑我们的情况:
dist_part1形状为
[B, N, M]
dist_part2形状为
[B, N, 1]
dist_part3形状为
[B, 1, M]
在这种情况下:
对于第一个维度
B
,两个张量的大小都是B
,所以没有问题。对于第二个维度,dist_part2的大小为
N
,而dist_part3的大小为 1。由于dist_part3在这个维度的大小为1,它会被复制
N
次以匹配dist_part2
。对于第三个维度,dist_part2的大小为 1,而 dist_part3的大小为
M
。同样,由于dist_part2 在这个维度的大小为1,它会被复制M
次以匹配dist_part3
。
因此,当这三个张量相加时,每个张量都扩展到 [B, N, M]
的形状,并执行元素级加法。
这就是为什么结果自动变为 [B, N, M]
形状的原因。
以上即为两片点云分两批次,单独批次计算每个点云间的欧氏距离的结果.
