unit原子距離

GraphL發表於2024-11-03

你的程式碼計算方式看起來是正確的,但讓我們逐步確認每個部分的邏輯。

程式碼分析

  1. 計算座標差異

    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 向量)。
  2. 計算徑向距離

    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])表示的是:

  1. 第 0 條邊:這個索引對應於你在計算時的第 0 條邊(edge)。

  2. 第 0 個原子:在殘基 1 中的第 0 個原子(比如,殘基 1 的第 0 個原子座標)。

  3. 第 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 個原子之間的平方距離。

相關文章