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
}
答案 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];
}
}
}
}
假设src
和dst
是大小为n_rows*n_cols
的不同的1d向量......