尝试写下一些值以及所需的索引。因此,对于 N = 1、M = 2、L = 3,例如:
i j k index
0 0 0 0
0 0 1 1
0 0 2 2
0 1 0 3
0 1 1 4
0 1 2 5
1 0 0 6
...
现在你可以观察到每增加i
,指数应增加 6,
这是M*L
。并且对于每增加j
,索引应增加 3,即L
.
(更一般地说,您需要将某个维度的索引乘以all不太重要的维度的索引)
所以我们有:
array[N, M, L] -> flat_memory[N * M * L]
flat_index(i, j, k) = M * L * i + L * j + k
这绝不是唯一有效的方法。您可以根据需要重新排列顺序,适当更改被乘数,因此这些都是展平它的有效方法:
flat_index(i, j, k) = M * L * i + M * k + j
flat_index(i, j, k) = N * L * j + L * i + k
flat_index(i, j, k) = N * L * j + N * k + i
flat_index(i, j, k) = M * N * k + M * i + j
flat_index(i, j, k) = M * N * k + N * j + i