【发布时间】:2011-01-26 21:38:19
【问题描述】:
在 C++ 中,W * H * D 大小的 3D 数组的索引值是多少?
对于特定的 i、j、k,这是正确的索引:
i*W*H+j*W+k
【问题讨论】:
标签: c++ arrays multidimensional-array
在 C++ 中,W * H * D 大小的 3D 数组的索引值是多少?
对于特定的 i、j、k,这是正确的索引:
i*W*H+j*W+k
【问题讨论】:
标签: c++ arrays multidimensional-array
你所写的相当于指针运算:
T x[D][H][W];
x[i][j][k]; // Pointer arithmetic done here
显然,根据您订购D、H 和W(或i、j、k)的方式,计算会有所不同。
【讨论】:
没有一个“正确”的顺序,但您提供的版本应该可以工作。您应用索引的顺序将决定您是进行行优先还是列优先索引。如果您正在移植 Fortran 代码(例如),则可以反转“正常”C 顺序。
【讨论】:
在这种情况下,宽度、高度和深度是没有意义的。你需要知道的是,多维数组存储在row-major order中。
【讨论】:
是的,假设 i 的变化范围为 0 ... D-1,j 的变化范围为 0 ... H-1,k 的变化范围为 0 ... W-1。
不过,我认为拥有索引器的目的通常是表达稀疏矩阵中的关系,这样您就不需要处理整个事情(并为此消耗内存)。如果您的数据跨越整个矩阵,您可能会考虑将 3d 矩阵创建为指向指针数组的指针,这些指针本身每个都指向指针数组。使用它可以让您使用x[i][j][k] 表示法,但速度可能更快。
【讨论】:
如果您需要遍历所有元素,最好在
for i
for j
for k
订购。这样,它会是最快的,因为数组的索引每次都会增加 1,并且可以预先缓存值。 做到这一点的正确方法不止一种,但您可能选择了最好的一种。
【讨论】: