将 2d 数组索引为 1d

姆库兹

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

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];
} 

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

cmaster - 恢复莫妮卡

首先:为什么要摆脱二维数组?你认为二维数组的维度必须是常数吗?那么,在这种情况下,我有一个好消息要告诉你:你错了。这段代码应该可以完美运行:

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] = ...;
    }
}

您会看到,除了数组指针的有些隐晦的声明之外,索引与堆栈上的自动 2D 数组完全相同。


在给定的循环中,您希望相对于中心单元格寻址单元格。通过相对于该单元格实际寻址,最容易做到这一点:

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];
    }
}

这是有效的,因为二维数组与一维数组具有相同的内存布局(这是由 C 标准保证的)。


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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将1d缓冲区重新组织为2d数组

来自分类Dev

numpy:将2D数组乘以1D数组

来自分类Dev

使用指针时将2D数组用作多个1D数组

来自分类Dev

脾气暴躁:将1D数组作为2D数组而不进行整形

来自分类Dev

如何将2D数组转换为1D数组以在视图中显示

来自分类Dev

JAVA将2d数组的列作为1d数组传递

来自分类Dev

Python Pandas-将“ 1D”文件转换为2D数组

来自分类Dev

numpy将2D数组与1D数组连接

来自分类Dev

将2D数组作为参数传递给采用1D数组的函数

来自分类Dev

使用1d张量将Tensorflow索引为2d张量

来自分类Dev

将2D数组转换为相同大小但形状像1D的数组?

来自分类Dev

如何将Python 1D,2D或3D NumpPy数组保存到MATLAB .mat

来自分类Dev

将列表的1D数组转换为2D数组

来自分类Dev

有效的通用代码将Numpy中的2D或1D蒙版数组索引为1D数组

来自分类Dev

如何将numpy中的1D数组视为(1 x n)2D数组?

来自分类Dev

将2D数组转换为1D数组以创建数据框

来自分类Dev

Python:将2D数组扩展为多个1D数组

来自分类Dev

将2D数组的元素与两个1D数组的乘积进行比较?

来自分类Dev

将2d数组添加到1d数组

来自分类Dev

将点的2D数组转换为1D数组

来自分类Dev

将1d缓冲区重新组织为2d数组

来自分类Dev

使用指针时将2D数组用作多个1D数组

来自分类Dev

将数组从2d展平到1d

来自分类Dev

将2d数组作为1d参数fortran传递给子例程

来自分类Dev

将2D数组转换为1D数组错误

来自分类Dev

使用1d张量将Tensorflow索引为2d张量

来自分类Dev

我应该如何用numpy将3d数组中的1d数组乘以2d矩阵

来自分类Dev

numpy:将索引的2D数组转换为1D数组以进行交集计算

来自分类Dev

将1d数组的一部分渲染为2D?

Related 相关文章

热门标签

归档