多維矩陣轉一維矩陣


多維矩陣轉一維矩陣

說明:

有的時候,爲了運算方便或資料儲存的空間問題,使用一維陣列會比二維或多維陣列來得方便,例如上三角矩陣、下三角矩陣或對角矩陣,使用一維陣列會比使用二維陣列來得節省空間。

解法:

以二維陣列轉一維陣列爲例,索引值由0開始,在由二維陣列轉一維陣列時,我們有兩種方式:“以列(Row)爲主”或“以行(Column)爲主”。由於 C/C++、Java等的記憶體配置方式都是以列爲主,所以您可能會比較熟悉前者(Fortran的記憶體配置方式是以行爲主)。

以列爲主的二維陣列要轉爲一維陣列時,是將二維陣列由上往下一列一列讀入一維陣列,此時索引的對應公式如下所示,其中row與column是二維陣列索引,loc表示對應的一維陣列索引:

loc = column + row*行數

以行爲主的二維陣列要轉爲一維陣列時,是將二維陣列由左往右一行一行讀入一維陣列,此時索引的對應公式如下所示:
loc = row + column*列數

公式的推導您畫圖看看就知道了,如果是三維陣列,則公式如下所示,其中i(個數u1)、j(個數u2)、k(個數u3)分別表示三維陣列的三個索引:
以列爲主:loc = i*u2*u3 + j*u3 + k
以行爲主:loc = k*u1*u2 + j*u1 + i

更高維度的可以自行依此類推,但通常更高維度的建議使用其它資料結構(例如物件包裝)會比較具體,也不易搞錯。

在C/C++中若使用到指標時,會遇到指標運算與記憶體空間位址的處理問題,此時也是用到這邊的公式,不過必須在每一個項上乘上資料型態的記憶體大小。

代碼:

public class TwoDimArray {
     public static int[] toOneDimByRow(int[][] array) {
         int[] arr = new int[array.length * array[0].length];
             for(int row = 0; row < array.length; row++) {
                 for(int column = 0; column < array[0].length; column++) {
                     int i = column + row * array[0].length;
                     arr[i] = array[row][column];
                 }
             }
             return arr;
     }

     public static int[] toOneDimByColumn(int[][] array) {
         int[] arr = new int[array.length * array[0].length];
         for(int row = 0; row < array.length; row++) {
             for(int column = 0; column < array[0].length; column++) {
                 int i = i = row + column * array.length;
                 arr[i] = array[row][column];
             }
         }
         return arr;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章