将二维矩阵映射到一维数组

Map 2D matrix to 1D array

本文关键字:映射 一维数组 二维      更新时间:2023-10-16

我有两个容器:一个二维NxN矩阵和一个一维数组,它是矩阵的转置1D"版本"(因此对于5x5数组,我将有一个具有相同值的25个元素数组)。我想实现一个查询函数,将2D坐标作为参数,但将在等效的1D数组上做工作。

为了保证算法的效率严格是非二次型的,我想只访问数组而不访问矩阵。

我检查了其他问题,但他们都在谈论通过嵌套的for循环将整个矩阵转换为数组。我不想这样做,因为那样会花费2倍的时间。相反,我希望通过查询函数/方法对给定坐标按需进行转换。换句话说,对于给定数目的N列/行:

transpose(int i, int j) {
    int result;
    result = i * N + j;
    return result;
}

这是我使用的公式,但它是不正确的。例如,如果我想访问{5,5}位置的元素,结果将是5*5 + 5 = 30,这大于25(这将是5x5矩阵的元素总数)。

如果您有一个2d数组和一个1d数组具有相同的元素,那么以下将为真

  2d[i][j]=1d[i*number_of_columns+j]

我从你的帖子中假设你已经创建了一个2d数组的1d数组。注:ij是索引,索引从0

开始

编辑:如果您正在访问[5][5](作为最后一个元素)的元素,这意味着您的数组的顺序是6 by 6而不是5 by 5。因此,您的1d数组将具有6*6=36元素而不是25

您可以使用deepToString()方法将2D数组输出到String。这可以使诸如sort()之类的事情更容易执行。

假设声明的int mat2d[m][n];具有m行和n列,您可以将其转换为

int * mat1d = new int[m * n];
int k = 0;
for (int i = 0; i < m; ++i)
    for (int j = 0; j < n; ++i)
        mat1d[k++] = mat2d[i][j];

如果您只想在1D和2D坐标之间进行转换,请自己服务并从中生成函数:

const int width = 10;
// from 1D coordinate to 2D coordinate
int coord_1d = 25;
int coord_x = coord_1d % width;
int coord_y = coord_1d / width;
// from 2D coordinate to 1D coordinate
coord_1d = coord_x + coord_y * width;

你的问题很令人困惑,你说你不想要嵌套循环,这里是一个只有一个循环的转换

    int[][] a={
            {1,2,3,4,5,6},
            {4,5,6,7,8,9},
            {7,8,9,1,2,3},
            {1,2,3,4,5,6}
            };
    int[]b=new int[a.length*a[0].length];
    int x=0;
    for(int i=0, j=0;i<a.length&&j<a[0].length;i=(j==a[0].length-1?i+1:i),j=(j+1)%a[0].length)
        b[x++]=a[i][j];
    System.out.println(Arrays.toString(b));

如果你想转换为基于坐标,通过改变ij的值在for循环为这样的坐标将允许你转换为数组矩阵的一个子集