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

文章目录

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

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

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)
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

库、框架、脚手架和IDE一文讲明白

在区分上面几个问题前,咱们先看看几个疑问。 一、常见问题汇总 js css直接复制到服务器 然后引用不就行了么? 为什么还需要安装? 引入js不就是引入了框架了吗?框架就是js? 脚手架和框架都有架,是不是一…

Python | 月平均气候态 | SST

数据来源: NOAA Optimum Interpolation (OI) SST V2 下载地址: https://psl.noaa.gov/data/gridded/data.noaa.oisst.v2.html 空间分辨率: 5.0 degree latitude by 5.0 degree longitude global grid (72x36)87.5N,覆盖范围 01/1856 to 2023/0187.5…

每日一题 — 水果成篮

思路: 通过阅读上面文字得出问题:就去只有两个种类的最大长度的连续子数组,这时我们可以想到用哈希表来存储数据,记录数据的种类和每个种类的数量。 解法一:暴力递归(right每次遍历完都回退) 解…

十五届web模拟题整理

模拟赛一期 1.动态的Tab栏 请在 style.css 文件中补全代码。 当用户向下滚动的高度没有超过标题栏(即 .heading 元素)的高度时,保持 Tab 栏在其原有的位置。当滚动高度超过标题栏的高度时,固定显示 Tab 栏在网页顶部。 /* TODO…

01_QT编译报错:Cannot find file:问题解决

QT编译报错:Cannot find file:问题解决 报错原因:创建路径存在中文字符,将文件路径改为英文字符即可

异地两分部子网重复,如何远程更改其中一个分部子网信息

环境: 分部1:子网192.168.1.0/24 分部2:子网192.168.1.0/24 问题描述: 异地两分部子网重复,如何远程更改其中一个分部子网,原本没有问题目前要与总部建ipsec提示冲突无法都建立隧道 解决方案: 先G一下,看看有啥建议 在两个异地分部网络中,如果发现有子网地址出现…

电脑文件名乱码,数据恢复有高招!

在日常使用电脑的过程中,突然遭遇文件名乱码的情况,确实让人头疼不已。原本井井有条的文件目录,一下子变得杂乱无章,文件名变成了一堆无意义的乱码字符。这种情况不仅影响了文件的正常使用,还可能导致重要数据的丢失。…

【C++】拆分详解 - 内存管理

文章目录 前言一、C/C内存分布二、C语言中动态内存管理方式:malloc/calloc/realloc/free三、C内存管理方式  3.1 new/delete操作内置类型  3.2 new和delete操作自定义类型  3.3 operator new与operator delete函数 四、new和delete的实现原理  4.1 内置类型…

智能助力:大模型自动填写工单准确率达95%

基于大模型优秀的问答、总结和话术生成能力,主流联络中心纷纷接入大模型升级智能知识库、智能工单、智能陪练等应用。 以智能填单为例,借助大模型能够轻松从对话中提取出实体信息、判定对话意图、识别情绪、生成沟通摘要等。通过简单的Prompt&#xff0c…

鸿蒙TypeScript学习第13天:【元组】

1、TypeScript 元组 我们知道数组中元素的数据类型都一般是相同的(any[] 类型的数组可以不同),如果存储的元素数据类型不同,则需要使用元组。参考文档:qr23.cn/AKFP8k 元组中允许存储不同类型的元素,元组…

三方库移植之NAPI开发[4]异步调用:CallbackPromise

写在开头: 本文在 三方库移植之NAPI开发[1]—Hello OpenHarmony NAPI 的基础上修改hellonapi.cpp、index.ets,接着学习NAPI异步模型的Promise、Callback方式。本文共有三个示例,分别是Callback 异步接口示例、Promise 异步接口示例、规范异步…

【算法每日一练]-图论(lca) 最近公共祖先LCA,货车运输

目录 P3379:最近公共祖先LCA 思路: 货车运输 P3379:最近公共祖先LCA 思路: 首先进行的预处理,将所有点的深度和p数组求出来 设置:p[i][j]存的从i向上走2的j次方那么长的路径到的父节点 更深的点走到和…

STM32学习和实践笔记(8): 理解位带区和位带别名区

如前《STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (b)(含memory mapping图)-CSDN博客 》中所写, STM32一共有4GB的地址,对所有的寄存器、存储器、外设等进行统一编址。 每…

EaticSearch学习

ES学习目标 1、全文检索 2、ES介绍 2.1 安装(docker) docker pull elasticsearch:7.14.0 docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch:7.14.0初步检索 1、_cat GET /_cat/nodes:查看所…

MySQL选择普通索引还是唯一索引(2/16)

普通索引和唯一索引 基本概述 MySQL中可以创建普通索引与唯一索引,这两种索引的区别是: 普通索引(Non-Unique Index),也称为非唯一索引,它允许索引中的条目具有重复的键值。普通索引的主要目的是加快查询…

HarmonyOS开发学习:【DevEco Device Tool 安装配置(问题全解)】

本文介绍如何在Windows主机上安装DevEco Device Tool工具。 坑点总结: 国内部分网络环境下,安装npm包可能会很慢或者超时,推荐使用国内npm源(如淘宝源、华为源等);serialport这个npm包安装的过程中需要编…

暴力枚举法

虽然暴力枚举法有时候效率低&#xff0c;时间复杂度高&#xff0c;但是在面对小规模数据集的时候&#xff0c;暴力枚举法往往是很好的思维利器。 B: 01 串的熵&#xff08;5分&#xff09; 问题描述 #include <iostream> #include <cmath> #include <algorithm…

第二十六周代码(总结 + 查缺补漏)

蓝桥云课&#xff1a;刷题数量通过139题&#xff0c;尝试解决&#xff08;未做出&#xff09;18题。 其中蓝桥杯往年真题74题&#xff0c;尝试解决&#xff08;未做出&#xff09;6题算法模板题5题经典算法题20题&#xff0c;尝试解决&#xff08;未做出&#xff09;1题算法赛…

从零自制docker-9-【管道实现run进程和init进程传参】

文章目录 命令行中输入参数长度过长匿名管道从父进程到子进程传参[]*os.File{}os.NewFile和io.ReadAllexe.LookPathsyscall.Execstrings.Split(msgStr, " ")/bin/ls: cannot access : No such file or directory代码 命令行中输入参数长度过长 用户输入参数过长或包…