矩陣運算

對於初學者,此篇教學稍微進階,其中透過類別方法,建立需要的程式碼,如果不熟悉方法的定義,可以先參考物件導向程式設計再回來這裏持續閱讀。

二維陣列的結構可以透過數學矩陣來描述,一個二維陣列 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 將兩個陣列相乘輸出新矩陣結構。





沒有留言: