3d->;一维数组索引 在C++中,W*H*D大小的3D数组的索引值是什么?

3d->;一维数组索引 在C++中,W*H*D大小的3D数组的索引值是什么?,c++,arrays,multidimensional-array,C++,Arrays,Multidimensional Array,对于特定的i,j,k,这是正确的索引: i*W*H+j*W+k您所写的与指针算法等效,这将实现: T x[D][H][W]; x[i][j][k]; // Pointer arithmetic done here 显然,根据您订购D、H和W(或i、j、k)的方式,计算结果会有所不同。没有一个“正确”的顺序,但您给出的版本应该可以工作。应用索引的顺序将决定是执行行主索引还是列主索引。例如,如果您正在移植Fortran代码,则可以将“正常”的C顺序颠倒过来。在这种情况下,宽度、高度和深度是没有

对于特定的i,j,k,这是正确的索引:


i*W*H+j*W+k

您所写的与指针算法等效,这将实现:

T x[D][H][W];

x[i][j][k];  // Pointer arithmetic done here

显然,根据您订购
D
H
W
(或
i
j
k
)的方式,计算结果会有所不同。

没有一个“正确”的顺序,但您给出的版本应该可以工作。应用索引的顺序将决定是执行行主索引还是列主索引。例如,如果您正在移植Fortran代码,则可以将“正常”的C顺序颠倒过来。

在这种情况下,宽度、高度和深度是没有意义的。您需要知道的是多维数组存储在中。

是的,假设
i
的值从0。。。D-1,
j
的变化范围为0。。。H-1和
k
的变化范围为0。。。W-1

不过,通常情况下,我认为,使用索引器的目的是在稀疏矩阵中表示关系,这样就不需要处理整个问题(并为此花费内存)。如果您的数据跨越整个矩阵,您可能会考虑将3d矩阵创建为指向指针数组的指针,而指针数组本身就是指向指针数组的指针。使用此选项可以使用
x[i][j][k]
符号,但速度可能更快


请参阅以获取说明。

如果您需要对所有元素进行文档化,最好在

for i
    for j
        for k
秩序。这样,它将是最快的,因为数组的索引每次递增一,并且可以预先设置值。
没有唯一正确的方法可以做到这一点,但您可能选择了最好的方法。

这是如何解决这个问题的?因为他这样选择订单是有原因的。他可以选择他想要的任何顺序,但在这种情况下,在相同的迭代顺序下,对所有元素的迭代都会较慢。这可能不会更快,因为访问特定值需要3个指针解引用,而不仅仅是1个。不过,指针解引用比乘法更快?这取决于具体情况。在一个有硬件乘法器的平台上,可能不会。每次取消引用都需要一次内存读取(可能会导致缓存未命中),而且它们都是相关的,所以它们必须按顺序进行。@Oli:哦,好的。我记得NR的讨论,但这些信息可能已经过时。无论如何,我在回答中对这句话做了更多的限定谢谢最后一件事,澄清一下-如果我在j I k(column major?)中访问,我可以简单地交换j和我在索引计算中的位置,对吗?@Derek:你需要确保如果交换维度,你可以正确地替换索引和大小。