Pytorch中距离矩阵的一般计算

Pytorch中距离矩阵的一般计算,pytorch,linear-algebra,Pytorch,Linear Algebra,我有两个形状为(m,n)的张量a和b,我想用一些距离度量d计算距离矩阵m。也就是说,我想要m[I][j]=d(a[I],b[j])。这有点像cdist(a,b),但假设通用距离函数d,它不一定是p-范数距离。在PyTorch中是否有一种通用的实现方法 还有一个更具体的附带问题:是否有一种有效的方法来使用以下指标执行此操作 d(x,y) = 1 - cos(x,y) 编辑 我已经用答案解决了上述具体案例: 我建议使用广播:因为a,b都有形状(m,n)你可以计算 m = d( a[None, :,

我有两个形状为
(m,n)
的张量
a
b
,我想用一些距离度量
d
计算距离矩阵
m
。也就是说,我想要
m[I][j]=d(a[I],b[j])
。这有点像
cdist(a,b)
,但假设通用距离函数
d
,它不一定是p-范数距离。在PyTorch中是否有一种通用的实现方法

还有一个更具体的附带问题:是否有一种有效的方法来使用以下指标执行此操作

d(x,y) = 1 - cos(x,y)
编辑

我已经用答案解决了上述具体案例:


我建议使用广播:因为
a,b
都有形状
(m,n)
你可以计算

m = d( a[None, :, :], b[:, None, :])
其中,
d
需要对最后一个维度进行操作,例如

def d(a,b): return 1 - (a * b).sum(dim=2) / a.pow(2).sum(dim=2).sqrt() / b.pow(2).sum(dim=2).sqrt()

(这里我假设
cos(x,y)
表示
x
y
之间的标准化内积)

我不知道有这样的函数。请附上一些代码,你是否尝试实现它?我不知道如何开始。我已经根据答案解决了这个小问题。我再加上。
def d(a,b): return 1 - (a * b).sum(dim=2) / a.pow(2).sum(dim=2).sqrt() / b.pow(2).sum(dim=2).sqrt()