m×n 矩陣是排列在 m 行和 n 列中的一系列數。 顯示幾個矩陣。
您可以通過將單個元素相加來加合兩個尺寸相同的矩陣。 顯示了兩個矩陣相加的樣本。
m×n 矩陣可與一個 n×p 矩陣相乘,結果為一個 m×p 矩陣。 第一個矩陣的列數必須與第二個矩陣的行數相同。 例如,一個 4×2 矩陣與一個 2×3 矩陣相乘,產生一個 4×3 矩陣。
矩陣的行列的平面點可視為向量。 例如,(2, 5) 是具有兩個組件的向量,(3, 7, 1) 是具有三個組件的向量。 兩個向量的點積定義如下:
(a, b) • (c, d) = ac + bd
(a, b, c) • (d, e, f) = ad + be + cf
例如,(2, 3) 和 (5, 4) 的點積為 (2)(5) + (3)(4) = 22。 (2, 5, 1) 和 (4, 3, 1) 的點積為 (2)(4) + (5)(3) + (1)(1) = 24。 請注意,兩個向量的點積是一個數字,而不是另一個向量。 另外請注意,只有當兩個向量的組件數相同時,才能計算點積。
將 A(i, j) 作為矩陣 A 中第 i 行、第 j 列的項。 例如,A(3, 2)是矩陣 A 中第 3 行、第 2 列的項。 假定 A、B 和 C 是矩陣,且 AB = C, 則 C 的項計算如下:
C(i, j) =(A 的第 i 行)•(B 的第 j 列)
顯示了矩陣相乘的幾個樣本。
如果將平面中的點視為 1×2 矩陣,則可通過將該點乘以一個 2×2 矩陣來將該點變換。 顯示了應用於點 (2, 1) 的幾個變換。
前圖中顯示的所有變換都是線性變換。 某些其他變換(如平移)不是線性,不能表示為與 2×2 矩陣相乘的形式。 假定您要從點 (2, 1) 開始,將其旋轉 90 度,在 x 方向將其平移 3 個單位,在 y 方向將其平移 4 個單位。 可通過先使用矩陣乘法再使用矩陣加法來完成此操作。
後面跟一平移(與 1×2 矩陣相加)的線性變換(與 2×2 矩陣相乘)稱為仿射變換。 將仿射變換儲存於一對矩陣(一個用於線性部分,一個用於平移)的替換方案是將整個變換儲存於 3×3 矩陣。 若要使其起作用,平面上的點必須儲存於具有虛擬第三座標的 1×3 矩陣中。 通常的方法是使所有的第三座標等於 1。 例如,矩陣 [2 1 1] 代表點 (2, 1)。 示範了表示為與單個 3×3 矩陣相乘的仿射變換(旋轉 90 度;在 x 方向上平移 3 個單位,在 y 方向上平移 4 個單位)。
在前面的樣本中,點 (2, 1) 映射到了點 (2, 6)。 請注意,3×3 矩陣的第三列包含數字 0,0,1。 對於仿射變換的 3×3 矩陣而言,情況將總是如此。 重要的數字是列 1 和列 2 中的 6 個數字。 矩陣左上方的 2×2 部分表示變換的線性部分,第 3 行中的前兩項表示平移。
在 GDI+ 中,可以在 Matrix 對象中儲存仿射變換。 由於表示仿射變換的矩陣的第三列總是(0,0,1),因此在構造 Matrix 對象時,只需指定前兩列中的 6 個數。 Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4) 語句構造上面圖形中顯示的矩陣。
複合變換是一個接一個的變換序列。 請考慮下面列表中的矩陣和變換:
矩陣 A |
旋轉 90 度 |
矩陣 B |
在 x 方向上縮放 2 倍 |
矩陣 C |
在 y 方向上平移 3 個單位 |
如果從由矩陣 [2 1 1] 表示的點 (2, 1) 開始,並先後乘以 A、B、C,則點 (2, 1) 將按列出的順序經曆三種變換。
[2 1 1]ABC = [-2 5 1]
可以不將複合變換的三部分儲存於三個獨立的矩陣,而是一起乘以 A、B 和 C 來得到儲存整個複合變換的單個的 3×3 矩陣。 假定 ABC = D, 則一個點乘以 D 得出的結果與一個點先後乘以 A、B、C 的結果相同。
[2 1 1]D = [-2 5 1]
顯示了矩陣 A、B、C 和 D。
複合變換的矩陣可通過將幾個單獨的變換矩陣相乘而得到,這就意味著任何仿射變換的序列均可儲存於單個的 Matrix 對象中。
| 警告 |
複合變換的順序非常重要。 一般說來,先旋轉、再縮放、然後平移,與先縮放、再旋轉、然後平移是不同的。 同樣,矩陣相乘的順序也是重要的。 一般說來,ABC 與 BAC 不同。 |
Matrix 類提供了幾種構建複合變換的方法:Multiply 、Rotate 、RotateAt 、Scale 、Shear 和 Translate 。 下面的樣本建立了複合變換(先旋轉 30 度,再在 y 方向上縮放 2 倍,然後在 x 方向平移 5 個單位)的矩陣。
Matrix myMatrix = new Matrix();
myMatrix.Rotate(30);
myMatrix.Scale(1, 2, MatrixOrder.Append);
myMatrix.Translate(5, 0, MatrixOrder.Append);
顯示該矩陣。