【问题标题】:3d -> 1D array indexing3d -> 1D 数组索引
【发布时间】:2011-01-26 21:38:19
【问题描述】:

在 C++ 中,W * H * D 大小的 3D 数组的索引值是多少?

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

i*W*H+j*W+k

【问题讨论】:

    标签: c++ arrays multidimensional-array


    【解决方案1】:

    你所写的相当于指针运算:

    T x[D][H][W];
    
    x[i][j][k];  // Pointer arithmetic done here
    

    显然,根据您订购DHW(或ijk)的方式,计算会有所不同。

    【讨论】:

    • 谢谢! - 最后一件事,澄清一下 - 如果我在 j i k (主要列?)中访问,那么我可以简单地交换 j 和 i 在索引​​计算中的位置,对吗?
    • @Derek:您需要确保在交换尺寸时,正确替换索引尺寸。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        是的,假设 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 次。
        • 指针解引用比乘法快?
        • 视情况而定。在具有硬件乘法器的平台上,可能不是。每个取消引用都需要一次内存读取(可能会导致缓存未命中),并且它们都是相互依赖的,因此它们必须按顺序发生。
        • @Oli:哦,好的。我记得 NR 的讨论,但这些信息可能已经过时了。无论如何,我对我的回答中的陈述进行了更多的限定。 :)
        【解决方案5】:

        如果您需要遍历所有元素,最好在

        for i
            for j
                for k
        

        订购。这样,它会是最快的,因为数组的索引每次都会增加 1,并且可以预先缓存值。 做到这一点的正确方法不止一种,但您可能选择了最好的一种。

        【讨论】:

        • 这如何解决这个问题?
        • 因为他选择订单是有原因的。他可以选择他想要的任何顺序,但在这种情况下,迭代所有元素会因为相同的迭代顺序而变慢。
        猜你喜欢
        • 1970-01-01
        • 2012-07-27
        • 2023-02-21
        • 2013-12-14
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 2013-01-08
        • 1970-01-01
        相关资源
        最近更新 更多