我刚刚编写了一个C ++程序,用于管理具有动态分配内存的3D矩阵。
为了使用连续的内存块,我决定使用映射函数将矩阵的元素物理存储到1D数组。
为此,我有一个指向数组的T *_3D_matrix
指针,定义为
_3D_matrix = new T[height * width * depth];
其中height, width and depth
是构造函数的输入参数。
该程序工作正常,我甚至用Valgrind测试它并且没有发生内存问题。
我得不到的是:我的数组有height * width * depth = 12
个元素,映射函数似乎将一些元素映射到[0..11]
范围之外。
我在这里缺少什么?
编辑:
这是我从重新创建相同矩阵并在我的程序中打印它所得到的输出。
答案 0 :(得分:0)
假设你的例子:
width = 2
,height = 3
和depth = 2
x
位于[0, width)
,y
位于[0, height)
,z
位于[0, depth)
映射第二个元素应该是:
1*2*2 + 0*2 + 0 = 4
,但您得到6
。我认为原因是某些维度或索引在代码中的其他位置交换。在您的情况下,似乎width
或depth
为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
这意味着:
0 * width * depth + 1 * depth + 0 = 2
=> depth = 2
1 * width * depth + 0 * depth + 0 = 6
=> width * depth + 6
=> width = 3
height * width * depth= 12
=> height = 2
因此:
最大索引为{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
。与您的公式相比,x
和y
已被切换。