将 3d 数组索引到 1d 数组 - 邻居查找

Indexing a 3d array into a 1d array - neighbor finding

所以我有一个 3D 数组,它表示一个边界体积("cells" 的均匀网格),它已被展平成一个 1D 数组,以便我可以在 CUDA 中使用它。

我遇到的问题是我需要能够在我的统一网格中获取任何给定的 "cell" 并找到它的所有邻居。当你有一个 3D 数组时这很简单(它只有 3 个 for 循环从 -1 循环到 1 并正确索引到 3D 数组),但我很难尝试将其分解为适用于 1D 数组的版本.应该有一个简单的公式可以计算这个,但我就是想不通。

此外,边缘不应循环,这意味着左下角的单元格不应 "neighbor" 到右下角的单元格。

感谢任何帮助。谢谢。

您可以保留 3 个 for 循环。只需检查每个维度的边界并通过嵌套计算索引 addition/multiplication.

for (int i1 = -1; i1 <= 1; ++i1) {
    for (int i2 = -1; i2 <= 1; ++i2) {
        for (int i3 = -1; i3 <= 1; ++i3) {
            const int x1 = p1 + i1;
            const int x2 = p2 + i2;
            const int x3 = p3 + i3;
            if (   x1 >= 0 && x1 < n1
                && x2 >= 0 && x2 < n2
                && x3 >= 0 && x3 < n3) {
                neighbour = array[(x1*n2+x2)*n3+x3];
            }
        }
    }
}