用step迭代1D数组和2D数组

Iterate through 1D array and 2D array with step

本文关键字:数组 2D 1D step 迭代      更新时间:2023-10-16

遍历一维数组(伪二维),步长为3:

arr = new int[height * width * 3];
for (int i = 0; i < height * width * 3; i+=3) {
  arr[i] = 1;   
}

我已经试过了,但是我得到的是三分之一的列:

for (int y = 0; y < height * 3; y++) {
    for (int x = 0; x < width; x+=3) {
        arr[x + width * y] = 1;
    }
}

假设单元格的'size'为3个条目,则应该在内部循环中使用* 3。否则每行就会丢失2/3的细胞。您还需要将width乘以3才能得到正确的行。

for (int y = 0; y < height; y++) {
    for (int x = 0; x < width * 3; x+=3) {
        arr[x + width * 3 * y] = 1;
    }
}

一般情况下,在这种情况下需要使用以下结构:

for (int y = 0; y < height; y++) {
    for (int x = 0; x < width * cellWidth; x+= cellWidth) {
        arr[x + width * cellWidth * y] = 1;
    }
}

(cellWidth在你的情况下是3)

为了稍微简化它,您可以在循环中假设单元格的宽度为1(像正常情况一样),并在实际赋值时乘以cellWidth:

for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        int index = (x + width * y) * cellWidth;
        arr[index + 0] = 1; // First 'cell entry'
        arr[index + 1] = 1; // Second
        ...
        arr[index + cellWidth - 1] = 1; // Last
    }
}

另一个解决方案是使用struct创建更大的"项",例如:

typedef struct { int r, int g, int b } t_rgb;
t_rgb* arr = new t_rgb[height * width];
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        arr[x + width * y].r = 1;
    }
}

,您可以将其作为常规数组使用(编译器为您完成所有计算)。这也使得代码中发生的事情更加清晰。

你到底想要完成什么?在RGB图像中设置通道?我通常是这样做的:

for (int y = 0; y < height; y++)
    for (int x = 0; x < width; x++)
        arr[(x + width * y) * 3] = 1;

一般来说,要设置RGB值,您可以简单地添加这样的偏移量:

for (int y = 0; y < height; y++)
    for (int x = 0; x < width; x++)
    {
        size_t base = (x + width * y) * 3;
        arr[base + 0] = r;
        arr[base + 1] = g;
        arr[base + 2] = b;
    }