1. torch.expand()广播机制
在处理3D点云时, 有时需要对两帧点云进行逐点的三维坐标相加减、做点积等运算, 但是读入的PCD文件中,点云数量并不一定是相等的
那么首要的一个问题就是, 如何将两帧点云处理成大小相同的矩阵然后进行计算?
torch 中一个常用的方法是expand函数, 例如下面这段函数:
def expand_matrix(ori_A, ori_B):point_num_A = ori_A.size()[0] #原始点云A的点数point_dim = ori_A.size()[1] #原始点云A的坐标维度,一般为3维point_num_B = ori_B.size()[0]assert point_dim == ori_B.size()[1] #保障都是3维点云# 假定expand目标为(point_num_A, point_num_B, point_dim)# 对A进行广播A_expanded = ori_A.unsqueeze(1)print(f"expand A,shape= {A_expanded.shape}, target = {point_num_A, point_num_B, point_dim}")A_expanded = A_expanded.expand(point_num_A, point_num_B, point_dim)# 对B进行广播B_expanded = ori_B.unsqueeze(0)print(f"expand B,shape= {B_expanded.shape}, target = {point_num_A, point_num_B, point_dim}")B_expanded = B_expanded.expand(point_num_A, point_num_B, point_dim)return A_expanded, B_expanded
代码解释:
expand函数只能在原始 维度为1 的情况下进行扩展。如果尝试在一个不是 1 的维度上进行扩展,会引发错误。因此我们先用unsqueeze函数在目标位置上进行dim=1的扩充, 再进行expand。
注意事项
- expand 方法不会实际分配新的内存,而是通过引用的方式实现扩展。
- 使用 expand 后的张量仍然与原始张量共享底层数据。