AXI4协议实战:如何用AxCACHE和AxPROT优化你的SoC设计(附配置模板)
2026/3/17 20:31:44
对每个原子,在半径8Å内找最近的12个邻居 原子0: 邻居是 [原子3, 原子7, 原子12, ...] 共12个 原子1: 邻居是 [原子0, 原子5, 原子8, ...] 共12个 原子2: 邻居是 [原子1, 原子6, 原子15, ...] 共12个 ... 原子39: 邻居是 [原子2, 原子11, 原子38, ...] 共12个| 距离 | 邻居0 | 邻居1 | … | 邻居12 |
|---|---|---|---|---|
| 原子0 | 2.1Å | 2.3Å | … | 3.2Å |
| 原子1 | 2.2Å | 1.9Å | … | 3.1Å |
| 原子2 | 1.7Å | 1.8Å | … | 3.6Å |
| … | … | … | … | … |
| 原子40 | 1.5Å | 2.1Å | … | 3.9Å |
这是一个 (40, 12) 的距离矩阵
40个原子 × 12个邻居 = 480个距离值
关键理解:每个距离值独立扩展! 距离矩阵中的每一个格子(共480个): 1个距离 → 41维向量 例如: 原子0到邻居0的距离 2.1Å → [0.00, 0.00, ..., 0.78, 1.00, 0.78, ..., 0.00] (41维) 原子0到邻居1的距离 1.8Å → [0.00, 0.00, ..., 0.78, 1.00, 0.78, ..., 0.00] (41维) ... 共480个距离,每个变成41维输入: 距离矩阵 (40, 12) ↓ 480个距离值,每个做高斯扩展 ↓ 输出: 特征张量 (40, 12, 41) 形状含义: 40 = 原子数量 12 = 每个原子的邻居数量 41 = 每个距离扩展成的向量维度pythonimport numpy as np # 模拟:40个原子,每个12个邻居 n_atoms = 40 n_neighbors = 12 # 随机生成距离矩阵(实际中从CIF计算得到) distances = np.random.uniform(1.0, 6.0, size=(n_atoms, n_neighbors)) print(f"距离矩阵形状: {distances.shape}") # (40, 12) # 高斯扩展 class GaussianDistance: def __init__(self, dmin=0, dmax=8, step=0.2): self.filter = np.arange(dmin, dmax + step, step) # 41个中心 self.var = step def expand(self, distances): return np.exp(-(distances[..., np.newaxis] - self.filter) ** 2 / self.var ** 2) gdf = GaussianDistance() expanded = gdf.expand(distances) print(f"扩展后形状: {expanded.shape}") # (40, 12, 41) print(f"高斯中心数: {len(gdf.filter)}") # 41输出:
距离矩阵形状: (40, 12) 扩展后形状: (40, 12, 41) 高斯中心数: 41