【多維矩陣轉一維矩陣 】


 

 

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

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

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

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

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

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

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

#include<stdio.h>
#include<stdlib.h>

int main(void){
    int arr1[3][4] = {{1,2,3,4}, {5,6,7,8},{9,10,11,12}};
    int arr2[12] = {0};
    int row, column, i;
    
    printf("原二維矩陣: \n");
    for(row = 0; row < 3; row++){
        for(column = 0; column < 4; column++){
            printf("%4d", arr1[row][column]);
        }
        printf("\n");
    }
    
    printf("\n以列為主: ");
    for(row = 0; row < 3; row++){
        for(column = 0; column < 4; column++){
            i = column + row * 4;
            arr2[i] = arr1[row][column]; 
        }
    }
    
    for(i = 0; i < 12; i++){
        printf("%d ", arr2[i]);
    }
    
    printf("\n以行為主: ");
    for(row = 0; row < 3; row++){
        for(column = 0; column < 4; column++){
            i = row + column*3;
            arr2[i] = arr1[row][column];
        }
    }
    
    for(i = 0; i < 12; i++){
        printf("%d ", arr2[i]);
    }
    printf("\n");
    return 0;
}

 

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM