坐标转距离矩阵

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import torch


def by_l2_square(a, b):
    a = a.unsqueeze(-2)
    b = b.unsqueeze(-3)
    C = torch.sum((a - b) ** 2, dim=-1)
    return C


def by_p_norm(a, b, p):
    a = a.unsqueeze(-2)
    b = b.unsqueeze(-3)
    C = torch.linalg.vector_norm(a - b, ord=p, dim=-1)
    return C


def origin(a, b):
    B, n, _ = a.shape
    _, m, _ = b.shape

    C = torch.empty(B, n, m)
    for batch in range(B):
        for i in range(n):
            for j in range(m):
                C[batch, i, j] = torch.sum((a[batch, i] - b[batch, j])**2)
    return C


if __name__ == '__main__':
    n = 5
    m = 4
    a = torch.rand(1, n, 2)
    b = torch.rand(1, m, 2)

    ans1 = by_l2_square(a, b)
    ans2 = by_p_norm(a, b, 2)**2
    ans3 = origin(a, b)

    print(torch.allclose(ans1, ans3))
    print(torch.allclose(ans1, ans2))
    print(torch.allclose(ans2, ans3))



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nightmare004

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值