循环使用C ++中的3d索引1d数组

时间:2016-05-16 12:25:47

标签: c++ arrays

我创建了一个类,它通过在1D数组中存储数据并重载() operator来模仿3D bool数组。我已经尝试过我能找到和想到的每一种方法,例如,这段代码:

bool operator()(unsigned x, unsigned y, unsigned z) const { return _data[_zSize*_ySize*x + y*_ySize + z]; }

允许我访问我需要的每个元素(我知道(x,y,z)实际上在这里(z,y,x),但它不适合我),当我尝试迭代时遇到问题通过阵列。 考虑一个深度的3D数组:3,高度:4和宽度5,每个元素初始化为false。当我尝试反转数组中的所有值时(sx()返回depthsy() - heightsz() - width)< / p>

for (unsigned i = 0; i < x.sx(); ++i)
        for (unsigned j = 0; j < x.sy(); ++j)
            for (unsigned k = 0; k < x.sz(); ++k)
                x(i, j, k) = !x(i, j, k);

我得到以下结果(其余两个表面看起来相同):

11110
01110
01110
01111

因此,显然有些元素被访问并反转两次。当我尝试不同的索引数组方法时,模式会发生变化。有什么问题?

2 个答案:

答案 0 :(得分:4)

正确的操作符是

ls -l

答案 1 :(得分:1)

让我给出一个步长的概括方法。 假设您有一个3D数组,并且在(z,y,x)

中进行访问

通过这个索引,我假设,Matrix维度为 有z个平面,每个平面的大小为y,x,y宽度,y为高度。

我们首先需要可视化3D结构以及我们如何访问元素。

据说我们想要访问(3,4,1)

使用基于零的索引

这里我们z = 3,y = 4,x = 1,我们的所需平面是第4个平面,我们所需的行是第4个,必需元素是第1个。

因此转到所需平面:z *(平面尺寸)= z *(宽度*高度)

转到所需行,y * sizeo of Row = y *(height)//或y * row_bytes

要获得必需点,只需添加x * sizeof(一个点)//当每个点有3或4个值时,例如在Opencv 3通道数据中,特定于多通道数据。

因此,最终方程将是

考虑3个通道数据,即每个点uchar的值为3个值,

值= z *(宽*高)+ y *(高)+ x *(3 * sizeof(uchar))

因此,一旦获得值,就不会逐个提取每个像素值。

PS:3 * sizeof(uchar)是OpenCV中常用的Vec3b的替换版本,用于访问3 Channel uchar数据。