你的程式碼計算方式看起來是正確的,但讓我們逐步確認每個部分的邏輯。
程式碼分析
-
計算座標差異:
coord_diff1 = coord[row].unsqueeze(2) - coord[col].unsqueeze(1) # [n_edge, 14, 14, 3]
coord[row]
和coord[col]
分別獲取了兩個殘基的原子座標。unsqueeze(2)
和unsqueeze(1)
用於增加維度,使得計算能夠進行廣播(broadcasting),從而得到一個形狀為[n_edge, 14, 14, 3]
的張量。- 這個張量中的每個元素 $ \text{coord_diff1}[e][i][j] $ 表示第 $ e $ 條邊(edge)中,殘基 1 的第 $ i $ 個原子與殘基 2 的第 $ j $ 個原子之間的座標差異(一個 3D 向量)。
-
計算徑向距離:
radial = torch.einsum('eijc,eikc->eij', coord_diff1, coord_diff1)
torch.einsum
是一個強大的操作,用於根據指定的索引計算張量的乘法和求和。- 在這裡,
'eijc,eikc->eij'
表示式的意思是:eijc
代表coord_diff1
張量,其中e
是邊的索引,i
是殘基 1 的原子索引,j
是殘基 2 的原子索引,c
是 3D 座標的維度。eikc
表示同樣的coord_diff1
張量,但用於相同的邊和原子。->eij
表示最終結果是對最後一維(3D 座標)進行平方和(即計算 L2 範數的平方)。
最終結果
radial
最終將得到一個形狀為[n_edge, 14, 14]
的張量,其中每個元素表示對應的兩個原子之間的平方距離:\[\text{radial}[e][i][j] = (x_{i,j}^{e})^2 + (y_{i,j}^{e})^2 + (z_{i,j}^{e})^2 \]
確認
所以,整體來說,計算方式是正確的,你的實現將兩個殘基之間的原子座標差異計算為徑向距離的平方。這在許多分子建模和計算化學的任務中都是常見的處理方式。
在你所描述的上下文中,計算出的 radial
矩陣的第 0 行 0 列(即 radial[0][0][0]
)表示的是:
-
第 0 條邊:這個索引對應於你在計算時的第 0 條邊(edge)。
-
第 0 個原子:在殘基 1 中的第 0 個原子(比如,殘基 1 的第 0 個原子座標)。
-
第 0 個原子:在殘基 2 中的第 0 個原子(比如,殘基 2 的第 0 個原子座標)。
具體含義
-
radial[0][0][0]
代表的是:\[\text{radial}[0][0][0] = \| \text{coord\_diff1}[0][0] \|^2 \]其中,
coord_diff1[0][0]
是指第 0 條邊中殘基 1 的第 0 個原子與殘基 2 的第 0 個原子之間的座標差異(一個 3D 向量)。 -
最終,這個值就是殘基 1 中第 0 個原子與殘基 2 中第 0 個原子之間的 平方距離。如果你需要實際的距離,可以對這個值進行平方根操作。
總結
因此,radial[0][0][0]
表示的是第 0 條邊的第 0 個原子與第 0 個原子之間的平方距離。