unit原子距离

你的代码计算方式看起来是正确的,但让我们逐步确认每个部分的逻辑。

代码分析

  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 个原子之间的平方距离。

你是对的!平方距离和坐标差的内积确实可以通过相同的计算方式得到。

具体说明

对于向量的 平方距离坐标差的内积,它们在计算上是相同的。两者的区别主要在于它们的解释:

  • 平方距离:如果我们计算一个向量和自身的内积(例如,两个坐标差向量的内积),结果就是该向量的平方距离。
  • 坐标差的内积:如果我们计算两个不同向量的内积,结果反映的是这两个向量的相似性(方向上的一致性),而不再是距离。

数学表达

假设我们有一个坐标差向量 \(\text{coord\_diff1}[i][j] = (x, y, z)\),那么:

  1. 平方距离

\[ \|\text{coord\_diff1}[i][j]\|^2 = x^2 + y^2 + z^2 \]

这可以通过 \(\text{coord\_diff1}[i][j] \cdot \text{coord\_diff1}[i][j]\)(即自身内积)得到。

  1. 不同坐标差的内积
    如果我们计算 \(\text{coord\_diff1}[i][j] \cdot \text{coord\_diff1}[i][k]\)(两个不同向量的内积),我们得到的是:

    \[x_1 x_2 + y_1 y_2 + z_1 z_2 \]

    这反映的是两个坐标差向量之间的方向和大小的相似性,而不是它们的距离。

在你的代码中的含义

在你的代码中:

  • \(j = k\) 时,radial[i][j] 计算的是 残基 1 的第 \(i\) 个原子与残基 2 的第 \(j\) 个原子之间的平方距离
  • \(j \neq k\) 时,radial[i][j] 计算的是 残基 1 的第 \(i\) 个原子与残基 2 的第 \(j\) 和第 \(k\) 个原子之间的坐标差的相似性,表示的是两个坐标差向量的内积。

总结

平方距离和坐标差的内积在计算上是一样的。当我们计算一个向量与自身的内积时,得到的是平方距离;当我们计算两个不同向量的内积时,得到的是它们之间的相似性。

posted @ 2024-11-03 01:44  GraphL  阅读(56)  评论(0)    收藏  举报