3D -> 1D数组索引

3

C++中,大小为W*H*D的三维数组的索引值是什么?

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

i*W*H+j*W+k

5个回答

6
你所写的代码等同于这段指针算术代码:
T x[D][H][W];

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

显然,根据您如何排序DHW(或ijk),计算结果会有所不同。


谢谢!- 最后一个问题,为了澄清 - 如果我正在使用 j i k(列优先?)进行访问,那么我可以简单地交换索引计算中的 j 和 i,对吗? - Derek
@Derek:你需要确保如果你交换维度,你正确地替换两个索引和大小。 - Oliver Charlesworth

0

没有一个“正确”的顺序,但你给出的版本应该可以工作。你应用索引的顺序将决定你是进行行优先还是列优先索引。如果你正在移植Fortran代码(例如),反转“正常”的C顺序可能是有意义的。


0

在这个上下文中,宽度、高度和深度是没有意义的。你需要知道的是,多维数组是按行主序存储的。


0

是的,假设i从0到D-1变化,j从0到H-1变化,k从0到W-1变化。

通常,拥有索引器的目的是为了表达稀疏矩阵内部的关系,这样您就不需要处理整个矩阵(并为其分配内存)。如果您的数据跨越整个矩阵,您可以考虑将3D矩阵创建为指向指针数组的指针,它们本身又指向指针数组。使用这种方法允许您使用x[i][j][k]符号,但可能更快。

请参见http://www.nr.com/cpppages/chapappsel.pdf进行描述。


可能不会更快,因为访问特定值将需要3次指针解引用,而不仅仅是1次。 - Oliver Charlesworth
指针解引用比乘法更快吗? - John
这要看情况。在具有硬件乘法器的平台上,可能不需要。每个解引用都需要进行内存读取(可能会出现缓存未命中),并且它们都是相互依赖的,因此必须按顺序发生。 - Oliver Charlesworth
@Oli:哦,好的。我记得那个讨论是来自NR的,但那些信息可能已经过时了。无论如何,我在我的回答中对该声明进行了更详细的限定。 :) - John

-4
如果您需要迭代遍历所有元素,最好这样做:
for i
    for j
        for k

排序。这样做是最快的,因为数组的索引每次增加一,值可以被预缓存。

没有唯一正确的方法来做到这一点,但你可能选择了最好的方法。


这如何回答这个问题? - Oliver Charlesworth
因为他选择了这个顺序,所以肯定有原因。他本可以选择任何顺序,但在那种情况下,迭代所有元素的速度会更慢,而迭代顺序相同。 - Luka Rahne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接