2 回答

TA貢獻1802條經驗 獲得超4個贊
用于torch.cdist
L2 范數 - 歐氏距離
res?=?torch.cdist(mat,?mat2.permute(1,0),?p=2)
在這里,我曾經將frompermute
的 dim 交換為mat2
7,20
20,7

TA貢獻2065條經驗 獲得超14個贊
首先,PyTorch 中的矩陣乘法有一個內置運算符:@。因此,要將 mat 和 mat2 相乘,您只需執行以下操作:
mat @ mat2
(假設尺寸一致,應該可以工作)。
現在,要計算您似乎在第二個塊中計算的平方差之和(SSD 或 L2 范數),您可以做一個簡單的技巧。由于 L2 范數的平方||m_i - v||^2(其中m_i是矩陣的第 i 行M,v是向量)等于點積<m_i - v, m_i-v>- 根據您獲得的點積的線性度:因此您可以通過以下方式<m_i,m_i> - 2<m_i,v> + <v,v>計算向量中每一行的 SSD:計算一次每行的 L2 范數平方、一次每行與向量之間的點積以及一次向量的 L2 范數。這可以在 中完成。然而,對于 2 個矩陣之間的 SSD,您仍然會得到MvO(n^2)O(n^3)。不過,可以通過向量化操作而不是使用循環來進行改進。這是 2 個矩陣的簡單實現:
def mat_mat_l2_mult(mat,mat2):
rows_norm = (torch.norm(mat, dim=1, p=2, keepdim=True)**2).repeat(1,mat2.shape[1])
cols_norm = (torch.norm(mat2, dim=0, p=2, keepdim=True)**2).repeat(mat.shape[0], 1)
rows_cols_dot_product = mat @ mat2
ssd = rows_norm -2*rows_cols_dot_product + cols_norm
return ssd.sqrt()
mat = torch.randn([20, 7])
mat2 = torch.randn([7,20])
print(mat_mat_l2_mult(mat, mat2))
所得矩陣的每個單元格將具有中每行和每列之間i,j差異的 L2 范數。imatjmat2
添加回答
舉報