PointNet++函数square_distance(src, dst):计算两组点之间的欧式距离(代码详解)

news2024/11/24 22:35:14

文章目录

      • 一、计算两组点之间的欧式距离
      • 二、举例
      • 三、中间结果输出

一、计算两组点之间的欧式距离

def square_distance(src, dst):
    """
    Calculate Euclid distance between each two points.

    src^T * dst = xn * xm + yn * ym + zn * zm;
    sum(src^2, dim=-1) = xn*xn + yn*yn + zn*zn;
    sum(dst^2, dim=-1) = xm*xm + ym*ym + zm*zm;
    dist = (xn - xm)^2 + (yn - ym)^2 + (zn - zm)^2
         = sum(src**2,dim=-1)+sum(dst**2,dim=-1)-2*src^T*dst

    Input:
        src: source points, [B, N, C]
        dst: target points, [B, M, C]
    Output:
        dist: per-point square distance, [B, N, M]
    """
    B, N, _ = src.shape
    _, M, _ = dst.shape
    dist = -2 * torch.matmul(src, dst.permute(0, 2, 1))
    dist += torch.sum(src ** 2, -1).view(B, N, 1)
    dist += torch.sum(dst ** 2, -1).view(B, 1, M)
    return dist

🍉解释:

  • B, N, _ = src.shape:获取输入源点和目标点的形状信息,其中 B 表示批量大小,N 表示源点的数量

  • _, M, _ = dst.shape:M 表示目标点的数量,C 表示每个点的维度

  • dist = -2 * torch.matmul(src, dst.permute(0, 2, 1)):这一步计算了两组点之间的叉乘积在这里插入图片描述

    • dst.permute(0, 2, 1):将目标点张量 dst 的第二维和第三维进行交换,以便进行点积
      在这里插入图片描述
      同理,src为N x C,dst为M x C,需要将M x C转置成C x M才可以进行点积(N x C)·(C x M)
    • torch.matmul :计算源点和目标点之间的点积,结果 dist 是一个形状为 [B, N, M] 的张量,表示每对源点和目标点之间的点积
  • dist += torch.sum(src ** 2, -1).view(B, N, 1):计算了源点和目标点的平方和,并将其广播到与 dist 相同的形状在这里插入图片描述

    • torch.sum(src ** 2, -1):计算张量 src 中每个点的平方和,src ^2 将 src 中的每个元素都平方,然后 torch.sum 函数对最后一个维度(即 -1 所代表的维度)进行求和,最后一个维度被求和消除。
    • 假设 src 张量的形状是 [B, N, D],其中 B 表示批量大小,N 表示点的数量,D 表示每个点的维度。那么 torch.sum(src ** 2, -1) 的结果形状将是 [B, N],其中每个元素表示了原张量中相应位置点的平方和
    • view(B, N, 1):对张量调整到[B, N, 1],以便与后续的计算相兼容
  • dist += torch.sum(dst ** 2, -1).view(B, 1, M):将这些平方和加到 dist 上,以完成欧氏距离的计算在这里插入图片描述

  • dist:张量,函数返回每对源点和目标点之间的欧氏距离的平方,形状为 [B, N, M]

计算欧式距离的平方等价于下方等式

( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 + ( z 1 − z 2 ) 2 (x_{1}-x_{2})^{2}+(y_{1}-y_{2})^{2}+(z_{1}-z_{2})^{2} (x1x2)2+(y1y2)2+(z1z2)2=
x 1 2 + y 1 2 + z 1 2 + x 2 2 + y 2 2 + z 2 2 − 2 x 1 x 2 − 2 y 1 y 2 − 2 z 1 z 2 x_{1}^{2}+y_{1}^{2}+z_{1}^{2}+x_{2}^{2}+y_{2}^{2}+z_{2}^{2}-2x_{1}x_{2}-2y_{1}y_{2}-2z_{1}z_{2} x12+y12+z12+x22+y22+z222x1x22y1y22z1z2

二、举例

假设有两组点,分别是 srcdst

import torch

def square_distance(src, dst):
    B, N, _ = src.shape
    _, M, _ = dst.shape
    dist = -2 * torch.matmul(src, dst.permute(0, 2, 1))
    dist += torch.sum(src ** 2, -1).view(B, N, 1)
    dist += torch.sum(dst ** 2, -1).view(B, 1, M)
    return dist

# 定义源点和目标点
src = torch.tensor([[[1, 2, 3], [4, 5, 6]]])  # shape: [1, 2, 3]
dst = torch.tensor([[[7, 8, 9], [10, 11, 12], [13, 14, 15]]])  # shape: [1, 3, 3]

dist = square_distance(src, dst)
print(dist)

结果
在这里插入图片描述
例如
( 7 − 1 ) 2 + ( 8 − 2 ) 2 + ( 9 − 3 ) 2 = 108 (7-1)^{2}+(8-2)^{2}+(9-3)^{2}=108 (71)2+(82)2+(93)2=108

三、中间结果输出

  • 对于dist = -2 * torch.matmul(src, dst.permute(0, 2, 1))
    在这里插入图片描述
  • 对于torch.sum(src ** 2, -1)
    在这里插入图片描述
    • tensor([[14, 77]]):这是一个形状为 (1, 2) 的张量,表示一个批次中有两个源点,每个源点有两个坐标分量。具体地,它包含了以下信息:第一个源点的坐标是 (14, 77)。
  • 对于torch.sum(src ** 2, -1).view(B, N, 1)
    在这里插入图片描述
    • tensor([[[14], [77]]]):这是一个形状为 (1, 2, 1) 的张量,表示一个批次中有两个目标点,每个目标点有一个坐标分量。具体地,它包含了以下信息:
      第一个目标点的坐标是 (14)
      第二个目标点的坐标是 (77)
  • 对于dist += torch.sum(src ** 2, -1).view(B, N, 1)
    在这里插入图片描述
  • 对于torch.sum(dst ** 2, -1)
    在这里插入图片描述
  • 对于torch.sum(src ** 2, -1).view(B, N, 1)
    在这里插入图片描述
  • 对于dist += torch.sum(src ** 2, -1).view(B, N, 1)
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1589783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模块化组合优势凸显钡铼IOy系列轻松应对大规模工业自动化工程

模块化组合是钡铼IOy系列独立式I/O模块的一大优势,它为大规模工业自动化工程提供了灵活性、可扩展性和定制性,从而轻松应对不同规模和复杂度的工厂应用。以下是关于模块化组合优势的详细解析: 1. 灵活性和定制性 模块化设计使得钡铼IOy系列…

字节Coze实现多Agent模式,文内在线体验,实时给产品经理提需求

摘要: 多Agent模式是一种分布式计算范式,它通过将复杂任务分解为多个子任务,并由独立的智能体(Agents)并行处理,从而提高系统的处理能力和效率。这种模式在自然语言处理、机器学习和其他数据密集型应用中尤…

未来汽车硬件安全的需求(1)

目录 1.概述 2.EVITA 2.1 EVITA HSM 2.2 EVITA保护范围 3.市场变化对车载网络安全的影响 3.1 非侵入式攻击的风险 3.2 量子计算机的蛮力攻击 3.3 整车E/E架构的变化 3.4 网络安全标准和认证 3.5 汽车工业的网络安全措施 4.汽车安全控制器 4.1 TPM2.0 4.2 安全控…

【2024最新】微信公众号怎么开启留言功能

关注微信公众号:怒码少年,回复关键词【电子书】可以免费获取计算机相关电子书 本文首发于:原文阅读-wx公众号:怒码少年 大家好,我是小码。 微信公众号从18年开始,正式关闭了留言功能。自此以后新注册的公…

华为校园公开课走入上海交大,鸿蒙成为专业核心课程

4月12日,华为校园公开课在中国上海交通大学成功举办,吸引了来自计算机等相关专业的150余名学生参加。据了解,由吴帆、陈贵海、过敏意、吴晨涛、刘生钟等教授在中国上海交通大学面向计算机系本科生开设的《操作系统》课程,是该系学…

python中time库的time.time()函数的作用是什么?

python中time库的time.time()函数的作用是什么? 作用:Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数)。 time()方法语法:time.time() #!/usr/bin/python # Write Python 3 code in this onlin…

程序“猿”自动化脚本(一)

1.剪贴板管理器📋 您是否曾经发现自己在处理多个文本片段时忘记了复制的内容?有没有想过有一个工具可以跟踪您一天内复制的所有内容? 该自动化脚本会监视您复制的所有内容,将每个复制的文本无缝存储在时尚的图形界面中&#xff0c…

中国绿色技术助力全球能源转型(国际论坛)

中国的清洁能源发展战略和实践对全球能源结构转型产生了深远影响。作为全球最大的可再生能源生产和消费国,中国在推动国内可再生能源产业发展的同时,也积极与世界各国分享技术和经验,促进全球范围内清洁能源技术的普及和应用成本的降低。例如…

乘势而上 韧性增长丨凡泰极客入选华为首批HarmonyOS开发服务商

3月日,凡泰极客受邀参加华为在南京举办的“鲸鸿动能服务商政策发布暨鸿蒙服务商先锋计划授牌仪式”。此次仪式主题为“乘势而上,韧性增长”,首批HarmonyOS开发服务商汇聚一堂,携手共进,打造鸿蒙生态繁荣未来。凡泰极客…

PCIe总线-存储器域和PCIe总线域访问流程(二)

1.概述 PCIe总线的最大特点是像CPU访问DDR一样,可以直接使用地址访问PCIe设备(桥),但不同的是DDR和CPU同属于存储器域,而CPU和PCIe设备属于两个不同的域,PCIe设备(桥)的地址空间属于…

李彦宏放话:百度AI大模型绝不抢开发者饭碗

关注卢松松,会经常给你分享一些我的经验和观点。 昨晚,李彦宏内部讲话称:AI大模型开源意义不大,百度绝不抢开发者饭碗。 但你一定要说话算话哦,可千万别说:“我永远不做手机,谁再敢提做手机就给…

最新PDD商家端Anti-Content参数逆向分析与纯算法还原

文章目录 1. 写在前面2. 接口分析3. 断点分析4. 扣JS代码 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

jeecg-boot安装

我看大家都挺关注,所以集中上传了下代码和相关工具,方便大家快速完成 链接:https://pan.baidu.com/s/1-Y9yHVZ-4DQFDjPBWUk4-A 提取码:op1r 1. 下载代码 下载地址 : JEECG官方网站 - 基于BPM的低代码开发平台(低代码平台_零代…

Qt | 对象树与生命期(对象的创建、销毁、擦查找)

一、组合模式与对象树 1、组合模式指的是把类的对象组织成树形结构,这种树形结构也称为对象树,Qt 使用对象树来管理 QObject 及其子类的对象。注意:这里是指的类的对象而不是类。把类组织成树形结构只需使用简单的继承机制便可实现。 2、使用组合模式的主要作用是可以通过…

【Git教程】(十二)工作流之项目设置 — 何时使用工作流,工作流的结构,项目设置概述、执行过程及其实现 ~

Git教程 工作流之项目设置 1️⃣ 何时使用工作流2️⃣ 工作流的结构3️⃣ 概述4️⃣ 使用要求5️⃣ 执行过程及其实现5.1 基于项目目录创建一个新的版本库5.2 以文件访问的方式共享版本库5.3 用 Git daemon 来共享版本库5.4 用 HTTP 协议来共享版本库5.5 用 SSH 协议来共享版…

springboot的logback.xml默认配置文件

logback.xml <?xml version"1.0" encoding"UTF-8"?> <configuration><!-- 控制台输出 --><appender name"STDOUT" class"ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:s…

商城系统个性化功能——可视化编辑

商城系统的普及化&#xff0c;让很多中小企业和商家也开始接触商城系统管理&#xff0c;之前在使用第三方平台时&#xff0c;大多数商城系统的样式都是固定的&#xff0c;商城页面也不能按照自己的想法去调整。 现在&#xff0c;随着商城系统越来越普遍&#xff0c;商城系统功…

C语言--结构体大小

基本数据类型占用的字节数分别为:char(1),short(2),int(4),long(4),long long(8),float(4),double(8)。 分析一下下面结构体占用的字节数。 struct A { int a; }; struct B { char a; int b; }; int main() { printf("sizeof(struct A)%d\n", sizeof(struct A));//测…

在Windows 10中打开PowerShell的几种方法,总有一种适合你

PowerShell是一种比命令提示符更强大的命令行shell和脚本语言。自Windows10发布以来,它已成为默认选择,并且有许多方法可以打开它。 PowerShell和命令提示符之间的区别是什么 PowerShell的使用更复杂,但它比命令提示符强大得多。这就是为什么它成为超级用户和it专业人员的…

深度学习入门(2)

一。Matplotlib模块添加 Matplotlib是用于绘制图形的库&#xff0c;使用 Matplotlib 可以轻松地绘制图形和实现数据的可视化。 pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple 二、绘制简单图形 import numpy as np import matplotlib.pyplot as plt #…