在C ++中实现1d数组中的2d数组坐标

时间:2018-03-06 06:35:26

标签: c++ arrays

for循环中的代码用于x和y(j和i)"坐标"来自2d阵列。我如何在1d数组中实现此邻居/索引查找? 我想我可以为前四个方程实现它。但我对如何实施左上等感到困惑。

for(int i=0; i<cols*rows; i++){
        //Counts current index's 8 neigbour int values
      int count=0;
      int x = i%cols;
      int y = i/rows;
      //rows y i
      //cols x j

      count+= [grid][i][(j-1+cols)%cols] //left
         +[grid][i][(j+1+cols)%cols]    //right
         +[grid][(i-1+rows)%rows][j]    //up
         +[grid][(i+1+rows)%rows][j]    //down
         +[grid][(i-1+rows)%rows][ (j-1+cols)%cols]  //up-left
         +[grid][(i+1+rows)%rows][ (j+1+cols)%cols]  //down-right
         +[grid][(i+1+rows)%rows][ (j-1+cols)%cols]  //down-left
         +[grid][(i-1+rows)%rows][ (j+1+cols)%cols] ;//up-right
}

3 个答案:

答案 0 :(得分:0)

使用像这样的功能

inline int idx(const int i, const int j, const int rows) const
{
    return i * rows + j;
}

将2d指数转换为1d指数。 这样您就不必更改算法。

用法为grid[idx(i, (j-1+cols)%cols, rows)]

答案 1 :(得分:0)

从一维矢量开始:

?- S="B",L=["C","D","E"],maplist(string_concat(S),L,X).
S = "B",
L = ["C", "D", "E"],
X = ["BC", "BD", "BE"].

您可以通过不同的方式进行管理,例如

int rows = 10;
int cols = 10;
vector<int> grid(rows * cols);

您可以在二维平面中的任何给定for(int y = 0; y < rows; y++) { for(int x = 0; x < cols; x++) { int point = grid[y * rows + x]; } } x访问任意点。

左上角是:

y

右下角是

x = 0;
y = 0;

等等。

答案 2 :(得分:0)

从2d索引模式计算1d坐标的基本公式通常是以下之一:

  • row_index * row_length + column_index
  • column_index * column_length + row_index

哪一个适用于您的情况取决于您是否希望拥有row-based or column-based memory layout for your 2d array。将此索引的计算分解为单独的函数as suggested in the other answer

是有意义的

然后你只需要以某种方式填写值。

你可以这样做,例如:

// iterate big picture
// TODO: make sure to handle the edge cases appropriately
for (int i_row = 1; i_row < n_rows - 1; i_row++) {
    for (int i_col = 1; i_col < n_cols -1; i_col++) {
        // compute values
        dst[i_row*n_cols+i_col] = 0;
        for (int r = i_row-1; r < i_row+2; r++) {
            for (int c = i_col-1; c < i_col+2; c++) {
                dst[i_row*n_cols+i_col] += src[r*n_cols + c];
            }
        }
    }
}

假设srcdst是大小为n_rows*n_cols的不同的1d向量......