将2D矩阵映射到1D数组

时间:2015-07-06 16:21:49

标签: java c++ arrays matrix

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

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

我已经检查了其他问题,但他们都谈到通过嵌套for循环将整个矩阵转换为数组。我不想这样做,因为这需要两次运行。相反,我希望通过查询函数/方法对给定坐标进行转换。换句话说,对于给定数量的N列/行:

transpose(int i, int j) {
    int result;

    result = i * N + j;
    return result;
}

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

提前致谢。

5 个答案:

答案 0 :(得分:2)

如果您有<div class="center-block"> <div class="btn-group"> <label class="btn btn-success vertical-align" ng-model="checkModel.left" btn-checkbox>1</label> <label class="btn btn-success vertical-align" ng-model="checkModel.middle" btn-checkbox>2 <span class="hidden-xs">and</span> Best <span class="hidden-xs">and all</span></label> <label class="btn btn-success vertical-align" ng-model="checkModel.left" btn-checkbox>3</label> <label class="btn btn-success vertical-align" ng-model="checkModel.middle" btn-checkbox>4</label> <label class="btn btn-success vertical-align" ng-model="checkModel.left" btn-checkbox>5</label> </div> </div> 数组和2d数组具有相同的元素,那么以下内容将为真

1d

我从你的帖子中假设你已经从2d中创建了一个1d数组。 注意 2d[i][j]=1d[i*number_of_columns+j] i是索引和记忆索引从j开始

编辑:如果您要访问0处的元素(作为最后一个元素),则表示您的数组的顺序为[5][5]而不是6 by 6。因此,您的1d数组将具有{{ 1}}元素,而不是5 by 5

答案 1 :(得分:1)

您可以使用deepToString()方法将2D数组输出到String。这样可以更轻松地执行sort()等操作。

答案 2 :(得分:0)

假设声明的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];

答案 3 :(得分:0)

如果您只想在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;

答案 4 :(得分:0)

你的问题很混乱,你说你不想要嵌套循环,这里只是一个循环转换

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

如果您希望转换基于坐标,通过将for循环中的ij值更改为此类坐标,您只能将数组转换为矩阵的子集