gpt4 book ai didi

c - 将 2d 数组索引到 1d

转载 作者:行者123 更新时间:2023-11-30 19:09:25 28 4
gpt4 key购买 nike

我想将二维数组转换为一维数组。我把代码中最重要的部分放在了。

int mask[3][3] = {{0, -1, 0}, {-1, 4, -1}, {0, -1, 0}}; 

for (i = 1; i < rows - 1; i++) {
for (j = 1; j < cols - 1;j++) {
int s;
s = mask[0][0] * image[i-1][j-1]
+ mask[0][1] * image[i-1][j]
+ mask[0][2] * image[i-1][j+1]

+ mask[1][0] * image[i][j-1]
+ mask[1][1] * image[i][j]
+ mask[1][2] * image[i][j+1]

+ mask[2][0] * image[i+1][j-1]
+ mask[2][1] * image[i+1][j]
+ mask[2][2] * image[i+1][j+1];
}
}

我的一维数组

for (k = rows + 1; k < (cols * rows) / 2; k++) {
int s;
s = 0 * image_in[k-rows-1]
- 1 * image_in[k-rows]
+ 0 * image_in[k-rows+1]

- 1 * image_in[k-1]
+ 4 * image_in[k]
- 1 * image_in[k+1]

+ 0 * image_in[k+rows-1]
- 1 * image_in[k+rows]
+ 0 * image_in[k+rows+1];
}

这应该是相同的,但我不知道我是否正确地进行了转换。有人可以告诉我这样可以吗?

最佳答案

首先:为什么要放弃二维数组?您认为二维数组的维度必须恒定吗?好吧,那么我有个好消息要告诉你:你错了。这段代码应该可以完美运行:

int width = ..., height = ...;
//Create a 2D array on the heap with dynamic sizes:
int (*image_in)[width] = malloc(height * sizeof(*image_in));

//initialize the array
for(int i = 0; i < height; i++) {
for(int j = 0; j < width; j++) {
image_in[i][j] = ...;
}
}

您会看到,除了数组指针的有点神秘的声明之外,索引与堆栈上的自动二维数组完全相同。

<小时/>

在给定的循环中,您想要相对于中心单元格寻址单元格。最简单的方法是相对于该单元格进行实际寻址:

for (i = 1; i < rows - 1; i++) {
for (j = 1; j < cols - 1;j++) {
int* center = &image_in[i][j];
int s = mask[0][0] * center[-width - 1]
+ mask[0][1] * center[-width]
+ mask[0][2] * center[-width + 1]

+ mask[1][0] * center[-1]
+ mask[1][1] * center[0]
+ mask[1][2] * center[1]

+ mask[2][0] * center[width - 1]
+ mask[2][1] * center[width]
+ mask[2][2] * center[width + 1];
}
}

这是可行的,因为 2D 数组具有与 1D 数组相同的内存布局(这是由 C 标准保证的)。

<小时/>

一维循环中的边缘处理总是错误的:它将针对每行的第一个和最后一个单元格执行循环体。 如果不在循环中引入一些 if() 语句,就无法解决此问题,这会显着减慢速度。

如果结果被证明无关紧要(您仍然需要排除第一行和最后一行以及一个单元格),则可以忽略它。但是,如果坚持使用 2D 数组,边缘处理会容易得多。

关于c - 将 2d 数组索引到 1d,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43280071/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com