一维数组到二维数组的映射

4
这可能听起来像是一个作业问题,但我发誓不是。我正在尝试为这个2D数组包装器类构建一个迭代器。我想如果我能解决这个问题,那么我就可以构建我的迭代器。
我有一个由9个连续整数组成的1D数组,从0开始到8结束。
[0, 1, 2, 3, 4, 5, 6, 7, 8]
我给出了两个变量horizontal_size = 3和vertical_size = 3。
我想将这个数组变成一个水平大小为h,垂直大小为v的2D数组,请简称它们为h和v。
我想要生成的结果是这样的:
0 1 2
3 4 5
6 7 8

给定1D数组中的值,该值告诉我索引,还给出了h和v(在这种情况下都为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个回答

8

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

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


我第一次没有正确地阅读你的答案,我以为你说的是“i/h”,这是我尝试过的一个答案,但结果并不正确。我甚至没有想到要除以“v”。谢谢! - Rhs
索引可以是 i/v 和 i%v,或者是 i/h 和 i%h,这取决于您的选择。如果 h=v,就像这里一样,您将无法区分它们的不同。 - Joni
我最初有一个大小为5乘2的东西。我只是发布了一个3乘3作为简单的例子。正确的答案是floor(i/v)。 - Rhs

6

这是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]?因为你需要在循环中嵌套循环,对于每一行,选择所有列并将其赋值给等式row*width+column得到的array[num_of_rows][num_of_columns]
此处的含义是:row被计算为向下取整的index除以number_of_columns。而column则是相同变量(mod)的余数。

1
我认为海报要求相反的方向:一个单独的循环来迭代2D数组。 - phimuemue

0

以下是我在C#中的做法,我认为这是将一维数组和二维数组进行转换的最简单、最高效的方法,循环中不需要进行任何数学计算,如果你有数百万项的数组(例如读写图像),这可能会很重要。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接