對於初學者,此篇教學稍微進階,其中透過類別方法,建立需要的程式碼,如果不熟悉方法的定義,可以先參考物件導向程式設計再回來這裏持續閱讀。
二維陣列的結構可以透過數學矩陣來描述,一個二維陣列 array(m,n) 可視為mxn的矩陣,矩陣在數學上的表示法如下:

我們來看看一個定義為 [3,3] 的陣列,其中存放了1 ~ 9等九個整數的陣列,轉換之後的矩陣表示法如下:

我們來看看一個定義為 [3,3] 的陣列,其中存放了1 ~ 9等九個整數的陣列,轉換之後的矩陣表示法如下:

上面的圖示為 2*3 矩陣 A 與 3*2 矩陣 B 的相乘運算,其中 A 矩陣每一列的元素分別與 B 矩陣每一行的元素相乖之後作加總,得到新的矩陣,而 A 矩陣的列數與B矩陣的行數,剛好是加總結果於新矩陣的位置索引。
接下來我們用一支小程式來說明兩個矩陣的相乘運算。
PrintArray 接受三個參數,第一個參數為二維陣列物件,第二以及第三個參數分別為二維陣列的列數與行數,接下來的 for 巢狀迴圈,將參數所傳入的陣列內容輸出於主控台,外層迴圈根據傳入的參教 row 限制其執行的次數,內層迴圈則根據參數 column 限制其執行的次數,內層迴圈每執行一次則將索引等於 i 、 j 的元素輸出於主控台。
方法 Dmartix 接受兩個二維陣列參數 arrayA 以及 arrayB ,並且對其進行其相乘的操作,其中宣告一個 2x2 的二維陣列 resultArray 以及整數型別變數 result ,用來存放每一個陣列相乘的結果。
後續的三層式的巢狀迴圈,第一層迴圈執行的次數為陣列參數 arrayA 的列數,第二層迴圈執行次數為陣列參數 arrayB 的行數,最後一個迴圈執行次數則為兩個陣列相乘運算的次數。
arrayA 為一 2x3 的陣列,因此第一個迴圈數目為 2 , arrayB為一 3x2 的陣列,因此第二個迴圈數目為 2 ,而 2x3 與 3x2 的矩陣每一次相乘會經過三次運算,因此第三個迴圈次數為 3 ,於每一次運算之後將其值加總指定給變數 result ,最後放入新的矩陣。
第 3 行開始的方法 Main 建立兩個二維陣列,分別是 arrayA 以及 arrayB ,呼叫方法PrintArray 將其結構輸出,最後引用方法 Dmartix 將兩個陣列相乘輸出新矩陣結構。
二維陣列的結構可以透過數學矩陣來描述,一個二維陣列 array(m,n) 可視為mxn的矩陣,矩陣在數學上的表示法如下:

我們來看看一個定義為 [3,3] 的陣列,其中存放了1 ~ 9等九個整數的陣列,轉換之後的矩陣表示法如下:

我們來看看一個定義為 [3,3] 的陣列,其中存放了1 ~ 9等九個整數的陣列,轉換之後的矩陣表示法如下:

上面的圖示為 2*3 矩陣 A 與 3*2 矩陣 B 的相乘運算,其中 A 矩陣每一列的元素分別與 B 矩陣每一行的元素相乖之後作加總,得到新的矩陣,而 A 矩陣的列數與B矩陣的行數,剛好是加總結果於新矩陣的位置索引。
接下來我們用一支小程式來說明兩個矩陣的相乘運算。
class Program { static void Main() { Matrixm myClass1 = new Matrixm(); int[,] arrayA = new int[2, 3]; int[,] arrayB = new int[3, 2]; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { arrayA[i, j] = i + j + 10; } } Console.WriteLine("以下輸出矩陣 arrayA 結構 !! "); myClass1.PrintArray(arrayA, 2, 3); for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { arrayB[i, j] = i + j + 1; } } Console.WriteLine("以下輸出矩陣 arrayB 結構 !! "); myClass1.PrintArray(arrayB, 3, 2); Console.WriteLine("將矩陣 arrayA 與 arrayB 相乘輸出其結果 !! "); myClass1.DMartix(arrayA, arrayB); Console.ReadLine(); } void PrintArray(int[,] intArray, int row, int column) { for (int i = 0; i < row; i++) { Console.Write("\n"); for (int j = 0; j < column; j++) { Console.Write(intArray[i, j] + "\t"); } Console.Write("\n"); } Console.Write("\n"); } void DMartix(int[,] arrayA, int[,] arrayB) { int[,] resultArray = new int[2, 2]; int result = 0; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { result = 0; for (int k = 0; k < 3; k++) result = result + arrayA[i, k] * arrayB[k, j]; resultArray[i, j] = result; } } PrintArray(resultArray, 2, 2); } }方法 PrintArray 以及 Dmartix ,前者輸出指定的矩陣結構,後者 Dmartix 則是執行 2x3 與 3x2 的矩陣相乘運算。
PrintArray 接受三個參數,第一個參數為二維陣列物件,第二以及第三個參數分別為二維陣列的列數與行數,接下來的 for 巢狀迴圈,將參數所傳入的陣列內容輸出於主控台,外層迴圈根據傳入的參教 row 限制其執行的次數,內層迴圈則根據參數 column 限制其執行的次數,內層迴圈每執行一次則將索引等於 i 、 j 的元素輸出於主控台。
方法 Dmartix 接受兩個二維陣列參數 arrayA 以及 arrayB ,並且對其進行其相乘的操作,其中宣告一個 2x2 的二維陣列 resultArray 以及整數型別變數 result ,用來存放每一個陣列相乘的結果。
後續的三層式的巢狀迴圈,第一層迴圈執行的次數為陣列參數 arrayA 的列數,第二層迴圈執行次數為陣列參數 arrayB 的行數,最後一個迴圈執行次數則為兩個陣列相乘運算的次數。
arrayA 為一 2x3 的陣列,因此第一個迴圈數目為 2 , arrayB為一 3x2 的陣列,因此第二個迴圈數目為 2 ,而 2x3 與 3x2 的矩陣每一次相乘會經過三次運算,因此第三個迴圈次數為 3 ,於每一次運算之後將其值加總指定給變數 result ,最後放入新的矩陣。
第 3 行開始的方法 Main 建立兩個二維陣列,分別是 arrayA 以及 arrayB ,呼叫方法PrintArray 將其結構輸出,最後引用方法 Dmartix 將兩個陣列相乘輸出新矩陣結構。
沒有留言:
張貼留言