3D到1D映射功能混乱

时间:2018-06-07 08:13:32

标签: c++ multidimensional-array

我刚刚编写了一个C ++程序,用于管理具有动态分配内存的3D矩阵。

为了使用连续的内存块,我决定使用映射函数将矩阵的元素物理存储到1D数组。

为此,我有一个指向数组的T *_3D_matrix指针,定义为

_3D_matrix = new T[height * width * depth];

其中height, width and depth是构造函数的输入参数。

Here is an example matrix and the mapping function

该程序工作正常,我甚至用Valgrind测试它并且没有发生内存问题。

我得不到的是:我的数组有height * width * depth = 12个元素,映射函数似乎将一些元素映射到[0..11]范围之外。

我在这里缺少什么?

编辑:

这是我从重新创建相同矩阵并在我的程序中打印它所得到的输出。

Index: Value

3 个答案:

答案 0 :(得分:0)

假设你的例子:

  • width = 2height = 3depth = 2
  • x位于[0, width)y位于[0, height)z位于[0, depth)

映射第二个元素应该是: 1*2*2 + 0*2 + 0 = 4,但您得到6。我认为原因是某些维度或索引在代码中的其他位置交换。在您的情况下,似乎widthdepth为3。

答案 1 :(得分:0)

您为y

的越界值计算了映射索引

您说height * width * depth= 12,并且:

index = y * width * depth + x * depth + z

我们在你的表中看到:

#.| Y | X | Z | index
--+---+---+---+------
1 | 0 | 1 | 0 | 2
2 | 1 | 0 | 0 | 6

这意味着:

  1. 0 * width * depth + 1 * depth + 0 = 2 => depth = 2
  2. 1 * width * depth + 0 * depth + 0 = 6 => width * depth + 6 => width = 3
  3. height * width * depth= 12 => height = 2
  4. 因此:

    • y在[0,1]
    • x在[0,2]
    • z在[0,1]

    最大索引为{x, y, z} = {2, 1, 1},其值为1 * 2 * 3 + 2 * 2 + 1 = 11

答案 2 :(得分:0)

假设我们将“3D”数组定义为

some_type m[1][3][2];

如果我们绘制它,那将会是这样的:

+------------+-------------+------------+-------------+------------+------------+
|                                    m[0]                                       |
+------------+-------------+------------+-------------+------------+------------+
|         m[0][0]          |         m[0][1]          |         m[0][2]         |
+------------+-------------+------------+-------------+------------+------------+
| m[0][0][0] |  m[0][0][1] | m[0][1][0] |  m[0][1][1] | m[0][2][0] | m[0][2][1] |
+------------+-------------+------------+-------------+------------+------------+

如果x代表第一个“维度”,y表示第二个维度,z表示第三个维度,那么m[x][y][z]等表达式将使用平面数组m[x * 3 * 2 + y * 3 + z]。数字3是第二维中元素的数量,2是第三维中元素的数量。

广义,像

这样的数组
some_type m[X][Y][Z];

作为平面数组,对于索引具有公式x * Y * Z + y * Z + z。与您的公式相比,xy已被切换。