pytorch 快速计算两个tensor的欧式距离

给定两个tensor: A 和 B。A的维度为 [m,h],  B的维度为 [n,h]。要求每两行之间计算他们的欧氏距离,返回一个维度为[m,n]的tensor。要求不能使用循环,也不能扩充复制一个tensor。

解:将欧式距离的公式展开,根号下面是a^{2}+b^{2}-2ab。a是tensor A中某一行的平方和,b是tensor B中某一行的平方和,ab是两个向量的内积。

所以代码为:

def EuclideanDistances(a,b):
    sq_a = a**2
    sum_sq_a = torch.sum(sq_a,dim=1).unsqueeze(1)  # m->[m, 1]
    sq_b = b**2
    sum_sq_b = torch.sum(sq_b,dim=1).unsqueeze(0)  # n->[1, n]
    bt = b.t()
    return torch.sqrt(sum_sq_a+sum_sq_b-2*a.mm(bt))


a = torch.rand(3,5)
b = torch.rand(4,5)
print(EuclideanDistances(a,b))

 

解释:其中问题关键就在于[m,1 ]+[1, n] 变成了一个[m,  n]

 

例如:

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值