在C ++中,W * H * D大小的3D数组的索引值是什么?
对于特定的i,j,k这是正确的索引:
我* W * H + J * W + K
答案 0 :(得分:6)
你所写的内容相当于这样做的指针运算:
T x[D][H][W];
x[i][j][k]; // Pointer arithmetic done here
显然,根据您订购D
,H
和W
(或i
,j
,k
)的方式,会有所不同。
答案 1 :(得分:0)
没有一个“正确”的订单,但您提供的版本应该有效。应用索引的顺序将决定您是执行行主索引还是列主索引。如果您正在移植Fortran代码(例如),则可以反转“正常”C顺序。
答案 2 :(得分:0)
在这种情况下,宽度,高度和深度毫无意义。您需要知道的是,多维数组存储在row-major order。
中答案 3 :(得分:0)
是的,假设i
从0 ... D-1变化,j
从0 ... H-1变化,k
从0变化... W- 1。
通常,我认为拥有索引器的目的是在稀疏矩阵中表达关系,这样你就不需要处理整个事情(并为它消耗内存)。如果您的数据跨越整个矩阵,您可能会考虑将3d矩阵创建为指向指针数组的指针,指针数组本身指向一个指针数组。使用此功能可以使用x[i][j][k]
表示法,但可能更快。
答案 4 :(得分:-4)
如果您需要迭代所有元素,最好在
中进行for i
for j
for k
顺序。这样,它将是最快的,因为数组的索引每次递增1并且可以预先缓存值。 不仅有一种正确的方法可以做到这一点,但你可能选择了最好的方法。