1D数组到2D数组映射

时间:2013-10-11 14:05:31

标签: arrays algorithm

这听起来像是一个家庭作业问题,但我发誓不是。

我正在尝试为这个2D数组包装类构建一个迭代器。我想如果我能够解决这个问题,那么我可以构建我的迭代器。

我有一个9个连续整数的1D数组,从0开始到8结束。

[0, 1, 2, 3, 4, 5, 6, 7, 8]

我有两个变量horizontal_size = 3vertical_size = 3

我想将此数组转换为horizontal_size vertical_size的{​​{1}}二维数组。为简洁起见,我们称他们为hv

我想要生成的结果是:

0 1 2
3 4 5
6 7 8

给出1D数组中的值,它告诉我索引,同样给出hv,在这种情况下都是3。有没有办法在2D数组上生成索引?

例如,1D数组中的第一个元素为0,映射到array[0][0]。第二个元素是1,映射到array[0][1]

我发现我可以通过array1d[i] mod vertical_size获得垂直索引。

           for getting the vertical index ::: th 

0 = [0] [0] 0 mod 3 = 0 1 = [0] [1] 1 mod 3 = 1 2 = [0] [2] 2 mod 3 = 2

3 = [1] [0]等等...... 4 = [1] [1] 5 = [1] [2]

6 = [2] [0] 7 = [2] [1] 8 = [2] [2]

但我不确定如何获得水平索引。

3 个答案:

答案 0 :(得分:7)

如果您的编程语言通过截断实现整数除法,则水平索引由floor(i / v)给出,或者仅为i/v

例如,floor(7/3)= 2,因此7位于第2行。

答案 1 :(得分:5)

这是java中的工作解决方案。请注意,%mod函数。

public static void main(String[] args) throws IOException {
    int[] oneD = {1,2,3,4,5,6};
    int w = 3;
    int h = 2;
    int[][] twoD = new int[h][w];
    int[] oneDReversed = new int[oneD.length];

    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            twoD[i][j] = oneD[i*w+j];
        }
    }

    for (int i = 0; i < w*h; i++) {
        oneDReversed[i] = twoD[(i / w)][(i%w)];
    }
}

为什么twoD[i][j] = oneD[i*w+j]?因为您在周期中循环执行“为每一行i设置所有列j并通过等值将其提供给array[num_of_rows][num_of_columns]row*width + column

保留意味着:row被计为向下舍入index devide number_of_columns。而column是其余的相同变量(mod)。

答案 2 :(得分:0)

这是我在C#中所做的事情,我想说它是在1D和2D数组之间转换的最简单,最高效的方法,它不需要在循环中进行任何数学运算,而如果您拥有数百万个数组项目(例如读取和写入图像)

C#代码:

// Creates a 2D array from a 1D array
public static int[,] Array1Dto2D(int[] array1D, int width, int height)
{
    int[,] array2D = new int[width, height];
    int i = 0;
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            array2D[x, y] = array1D[i];
            i++;
        }
    }
    return array2D;
}

// Creates a 1D array from a 2D array
public static int[] Array2Dto1D(int[,] array2D)
{
    int width = array2D.GetLength(0);
    int height = array2D.GetLength(1);
    int[] array1D = new int[width * height];
    int i = 0;
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            array1D[i] = array2D[x, y];
            i++;
        }
    }
    return array1D;
}