簡體   English   中英

將二維矩陣映射到一維數組

[英]Map 2D matrix to 1D array

我有兩個容器:一個二維 NxN 矩陣和一個一維數組,它是矩陣的轉置一維“版本”(因此對於 5x5 數組,我將有一個具有相同值的 25 個元素數組)。 我想實現一個查詢函數,它將以二維坐標作為參數,但將對等效的一維數組進行處理。

為了保持算法效率嚴格非二次,我只想訪問數組而不是矩陣。

我檢查了其他問題,但他們都在談論通過嵌套的 for 循環將整個矩陣轉換為數組。 我不想這樣做,因為這需要二次運行時間。 相反,我希望通過查詢函數/方法對給定坐標進行按需轉換。 換句話說,對於給定數量的 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]

我從您的帖子中假設您已經從二維數組中創建了一個一維數組。 注意ij是索引,記住索引從0開始

編輯:如果您正在訪問[5][5]元素(作為最后一個元素),這意味着您的數組的順序是6 by 6而不是5 by 5 。所以您的 1d 數組將有6*6=36元素而不是25 .

您可以使用deepToString()方法將二維數組輸出到字符串。 例如,這可以更輕松地執行諸如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));

如果您希望轉換基於坐標,通過將 for 循環中的ij值更改為這樣的坐標,您可以將矩陣的子集轉換為數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM