ALG09|矩陣:把多個量與作用規則一起組織
適用入口/必要先備/範圍邊界
適用入口:11 年級數學 A。本篇以「列欄語意、線性組合、有序乘法」為共同骨架,再討論二階矩陣可以反向還原的條件。本文只處理實數元素的矩陣。
必要先備:能進行實數四則運算,理解分配律與代數式代入;能用代入或消去處理簡單的二元一次聯立方程式;能閱讀資料表的分類、順序與單位。閱讀電腦示範時,需要會在已備妥的環境中貼上、執行及保存程式,但不要求先學過程式設計。矩陣、單位矩陣及二階反矩陣的必要觀念,都在本文內建立。
範圍邊界:資料表示與線性組合不限定為方陣;核心乘法示例是一個 矩陣與一個 矩陣的指定有序乘積,完整求出四個分量。反矩陣的計算只處理 可逆情形。本文不另算核心示例的反序乘積,不練矩陣高次冪,不另設高階方陣的乘積計算,也不展開高階反矩陣、轉置運算、平面線性變換或轉移矩陣。課綱將反方陣的確切計算限制在二階,並把平面線性變換與二階轉移方陣另列於 F-11A-3;不能把這項限制誤讀成所有矩陣運算都只能使用二階方陣。國家教育研究院:數學領域課綱(107年6月)
閱讀後,你應能把資料表寫成矩陣並解釋指定元素,計算同型矩陣的線性組合,按照指定順序求出相容尺寸矩陣的乘積,求可逆二階矩陣的反矩陣並回查,以及保存電腦運算紀錄、人工說明至少一個輸出元素的來源。
一、把數字排進方括號,究竟增加了什麼?
看到矩陣,最容易產生的疑問是:這不就是一張沒有表格線的數字表嗎?既然每一格最後仍然要做加減乘除,為什麼值得另學一套運算?
這個疑問抓住了一半的事實。矩陣沒有取消原來的算術,也不是在它出現以前,人們就不會處理多個未知數。矩陣代數形成以前,線性方程與行列式已經是數學研究的一部分;不能把「後來形成新的整體表示」說成「以前沒有有效方法」。MIMS EPrints
以十九世紀的一個代表節點來看:Arthur Cayley 在 1858 年的〈矩陣理論論文〉開頭,從一組線性方程式的簡寫引入矩陣,把分散在各條式子中的係數組織成一個整體,再研究這個整體如何相加、相乘與組合。他並不是先宣稱方程式無法計算,而是提出:一整組係數,也可以成為值得單獨運算與研究的數學對象。Archive.org
原有方法能做到什麼?我們可以逐條寫出關係,把前一組式子代入後一組式子,再利用分配律整理。這些方法依然正確。
不過,從表示方式來比較,當輸入、輸出和處理階段一起增加時,除了算術,還有一項工作必須一直做:追蹤「哪個係數屬於哪個量」「哪一組結果要交給下一組規則」。
矩陣增加的,不只是比較短的寫法,而是把這些位置關係固定下來,讓我們可以區分:
資料如何排列、同類資料如何合併,以及一組規則如何接到另一組資料或規則上。
下面用一個學校活動的教學情境說明。所有包裝內容與訂購數量都是為了講解而設定,不是歷史事件,也不是實際調查資料。我們會用它比較兩種表示方式,不把這個情境倒寫成矩陣的歷史發明原因。
二、一個元素不只是一個數,還有兩個位置
假設學校活動使用甲、乙、丙三種材料包,兩個班級的原始訂購表如下。
| 包別 | 一班訂購數,單位:包 | 二班訂購數,單位:包 |
|---|---|---|
| 甲包 | 3 | 2 |
| 乙包 | 4 | 1 |
| 丙包 | 2 | 5 |
如果保留分類順序,把數字部分寫在方括號內,就得到
本文採用臺灣數學課程手冊的名稱約定:
列是橫向的一排,對應英文 row;行是直向的一排,對應英文 column,也就是資料表常說的「欄」。〔來源:國家教育研究院數學領域課程手冊(114年1月),印刷第 576 頁〕
所以 有三列、兩行,是一個 矩陣,讀作「三乘二矩陣」。第一個數說明橫列有多少,第二個數說明直行有多少;它不是在要求先算 ,再把尺寸叫作「六階」。
在本文處理的實數範圍內,一個由實數按固定位置排成、具有 列與 行的長方形數表,稱為 矩陣,其中 是正整數。當 時,才是方陣; 方陣又稱為 階方陣。
若把矩陣記為
那麼 表示第 列、第 行的元素,其中
這兩個下標的先後不能交換。
回到訂購表, 的意思不是「第三十二個數」,而是:
先找第三列,也就是丙包;再找第二行,也就是二班。因此,它表示二班訂購五包丙包。
同樣地,
表示二班訂購兩包甲包;它不是一班訂購兩包丙包,儘管表內確實也有那個數字。
這裡有一項重要限制:方括號會保留數字的位置,卻不會自動保留位置的現實意義。
如果有人把直行順序改成「二班、一班」,卻沒有一起更改標籤與使用規則,數字可能一個都沒抄錯,解讀卻已經錯了。因此,保存矩陣資料時,還要保存橫列名稱、直行名稱、排列順序及單位。
數學上,兩個矩陣相等,必須尺寸相同,而且每個相同位置的元素都相等。但作為現實資料,即使兩個矩陣在數學上相等,若它們使用不同的分類或單位,也未必是在記錄同一件事。
三、線性組合:相同位置,必須還在說同一件事
假設活動改辦兩次,每次都採用原來的訂購方案 ,那麼各項訂購數都變成原來的兩倍:
這叫作矩陣的係數積:用一個數乘矩陣時,每個元素都乘上那個數。係數 不是只乘第一列,也不是只改矩陣的尺寸。
接著,兩次活動合計取消的包數記為
這張表的橫列仍依序是甲包、乙包、丙包,直行仍依序是一班、二班,單位仍然是包。新的訂購方案因而是
逐格計算:
例如右下角的 ,表示二班原本兩次共訂購 包丙包,取消兩包後,剩下八包。
這種由矩陣的係數積、加法與減法組成的式子,稱為矩陣的線性組合。若 都是 矩陣, 是實數,則
這個公式說的是:結果在第 列、第 行的數,由原來兩張表在相同位置的數來組成。
為什麼要求同型,也就是尺寸相同?因為不同尺寸的表,未必有完整的一一對應位置。即使尺寸相同,現實解釋仍須再過一關:那些位置是否代表相同的對象與相容的單位?
例如,若 的第一行其實是一張「二班取消數」表,直接計算 ,就可能拿一班的需求去減二班的取消數。數學上的逐格相減做得出來,不代表它回答了正確的現實問題。
我們也可以把結果加回取消數,檢查是否回到原先的兩倍方案:
這個回查確認了本例的加減計算。但倘若一開始就把班級標籤弄反,純粹的加減回查未必會發現它。因此,算式回查與資料語意回查,是兩件都要做的事。
係數也可以是零或負數。例如,所有元素都是零的 矩陣記為 ,則
零係數不會把矩陣的尺寸消掉。另一方面,線性組合在數學上允許得到負數或非整數;但在這個訂購情境中,若算出負的包數或不能拆分的零碎包數,就不能直接把它當成可執行的訂購方案。
四、矩陣乘法:不是同位置相乘,而是沿共同分類配對
接著回到原始訂購表 ,問另一個問題:每班需要多少支鉛筆、多少張卡紙?
假設三種材料包的內容如下,而且每包配方固定、不另外加贈材料。
| 材料 | 每甲包含量 | 每乙包含量 | 每丙包含量 |
|---|---|---|---|
| 鉛筆,單位:支 | 2 | 1 | 0 |
| 卡紙,單位:張 | 1 | 0 | 3 |
把配方寫成矩陣:
這次,橫列代表材料,直行代表包別。 表示每乙包有一支鉛筆; 則表示丙包不含鉛筆。這裡的零是確定的「沒有」,不是尚未調查的空缺值。
現在注意兩張表的接合處: 的三個直行,依序是甲包、乙包、丙包; 的三個橫列,也依序是甲包、乙包、丙包。
共同分類都是包別,而且順序一致。因此,我們可以把「每包需要多少材料」與「一共訂購多少包」配對。
先看一班的鉛筆需求。一班訂購三包甲包、四包乙包、兩包丙包,所以需要
支鉛筆。
每一項都有具體意義。例如
三項相加時,相加的都已經是鉛筆支數,而不是把支數和包數混加。
這正是矩陣乘法在此處的規則:拿左側矩陣的一個橫列,與右側矩陣的一個直行,按相同的中間分類逐項相乘,再把結果加起來。
令
四個元素分別是
因此
結果的橫列沿用 的材料分類,直行沿用 的班級分類。因此,一班需要十支鉛筆、九張卡紙;二班需要五支鉛筆、十七張卡紙。
結果矩陣的不同橫列可以記錄不同單位:第一列是鉛筆支數,第二列是卡紙張數。這不妨礙本例成立,因為每一格內部加總的各項,都已換成同一種材料的同一單位;我們沒有把兩列相加成一個含義不明的「材料總數」。
尺寸為什麼必須接得上?
是 , 是 ,所以
內側的兩個 必須相同,因為一個橫列取出的三個配方係數,要和一個直行取出的三個訂購數逐項配對。外側的 與 ,則分別留下兩種材料與兩個班級。
一般而言,若 是 , 是 ,則 是 ,而
其中, 指定左側矩陣的橫列, 指定右側矩陣的直行;中間的位置 逐一配對。NumPy 的二維矩陣乘法也採用這個內側尺寸必須相等的規則。NumPy
但仍要記住:尺寸相容,只保證數字可以依規則配對;在應用中,中間分類的名稱、順序與單位也必須相容。
同一個乘積,也是在組合幾種基本配方
我們還可以從另一個方向理解一班的需求。
三種材料包各自的內容,是 的三個直行:
每個直行的上方都記鉛筆支數,下方都記卡紙張數。一班訂購三、四、兩包,便是把三種配方分別取三倍、四倍、兩倍,再逐位置相加:
所以,矩陣乘法並不是和線性組合毫無關係的新口訣。 的每一個直行,都是按照 對應直行提供的係數,對 的各個直行作線性組合。
「橫列乘直行」告訴我們一格怎麼算;「配方的線性組合」則告訴我們,整個輸出為什麼應該這樣形成。
五、有序乘法:把規則接起來,不能任意調換前後
普通數的乘法可以交換,例如 。但不要因此直接認定矩陣也可以任意交換。
本例的 ,是在把 中各班的包數,交給 的材料配方處理。若把兩張表視為連接的作用規則,就是右側提供中間量,左側再處理那些量。
反過來寫,所接合的分類已經不同。本例即使只看數學尺寸,也能知道反序乘積會是 ,不會是我們需要的「兩種材料對兩個班級」的 結果。沒有必要另算它的各格,就已經能判斷它不是本題指定的輸出。
因此,正確說法不是「任何兩個矩陣換序後一定不同」,而是:
矩陣乘法沒有可以任意交換的保證;順序本身就是運算內容的一部分。
Cayley 在 1858 年的論文中,從連續兩組線性關係的代入說明矩陣乘法,並指出這種組合一般不具交換性。這不是為了讓運算變麻煩而增加的禁令,而是要忠實保留原來關係的先後。Archive.org
算出乘積後,我們得到的不只是一張答案表
假設完整照辦一班方案 次、二班方案 次,其中 是非負整數。從原始訂購表可知,三種包的總數依序是
若逐條代入配方,鉛筆需求是
卡紙需求是
這裡的四個係數 ,恰好就是 的四個元素。
原來, 不只保存這兩個班的一次答案,也把「先決定包數,再計算材料」合成了可以重複使用的規則。只要配方與方案內容不變,就可以利用這四個係數,處理不同的 。當 時,兩項材料需求也都是零,符合沒有採用任何方案的情況。
逐條代入當然也能得到相同結果。把算式寫成矩陣,不會憑空取消首次求出四個元素所需的乘加工作。它改善的是另一個層次:
把反覆出現的配對方式變成統一規則,讓整組資料與整組作用可以一起表示、組合、檢查和重用。
這也說明矩陣代數形成時的一項改變:研究者不只問「這組未知數是多少」,也能把一整組係數當成對象,研究其加法、組合、單位作用與逆向作用。Cayley 的原論文確實逐項建立了這些運算關係。Archive.org
不過,理論提出不等於立即普及。Nicholas Higham 在討論早期矩陣理論的書評中,引述 Tony Crilly 的研究指出,Cayley 的這篇論文起初並未獲得相稱的後續發展。不能把今天的使用規模倒寫成當時已經發生的影響。MIMS EPrints
六、反矩陣:不是每一組作用都能倒回去
前面一直在做正向工作:知道各種包數,求材料總量。
現在反過來:只知道材料總量,能不能還原原先的包數?
先把問題限制清楚。另一次活動只使用甲包與乙包,不使用丙包,配方仍然是甲包兩支鉛筆、一張卡紙,乙包一支鉛筆、不含卡紙。配方矩陣因此是
若甲包有 包、乙包有 包,鉛筆總數為 ,卡紙總數為 ,則
利用原有的代入方法,立刻得到
這已經是一套反向規則:從材料總量回到包數,而且不必每換一組總量,就重新設計解法。
寫成矩陣形式,就是
這張反向規則表,便是 的反矩陣,記為 ,也稱為反方陣。
什麼才算真的「還原」?
二階單位矩陣定義為
它的作用是不改變原來的兩個量:
所以,反矩陣不能只是針對某一組數字碰巧算回去。它必須與原矩陣互相組合後,得到不改變輸入的規則:
這是反矩陣的定義;存在反矩陣的方陣,稱為可逆方陣。這裡的還原,是對任意實數輸入成立的完整代數規則,不只是某一筆資料的猜測。Cayley 的原文也以兩種組合順序都得到單位矩陣來說明反矩陣。Archive.org
單位矩陣也提供了一個重要的相等情形:對任何二階矩陣 ,都有
因此,「不能任意交換」確實不等於「換序後永遠不同」。
二階公式為什麼是那個樣子?
對一般二階矩陣
正向關係是
把第一式乘 ,第二式乘 ,再相減:
同理,把第二式乘 ,第一式乘 ,再相減:
令
這個數稱為 的二階行列式,也寫成 。當 時,就可以除以它,得到
因此,反向規則的係數矩陣是
「交換對角線元素、另外兩格變號,再除以行列式」可以作為記法;但它不是沒有理由的排列口訣。上面的消去過程,解釋了每一個係數為什麼會出現在那個位置。
還可以直接確認這個公式確實形成雙向還原。令
則
而
所以,當 時,兩式除以 ,就得到
這個推導沒有要求 或 各自非零;真正不能為零的是整個 。
也因此,反矩陣不是把原矩陣每一格分別取倒數。我們的配方矩陣含有零,卻仍然有反矩陣;逐格取倒數在這裡根本無法完成。
完整計算與雙向回查
本例
的行列式為
行列式是負數並不妨礙可逆;條件是「不等於零」,不是「大於零」。
所以
依照矩陣乘法檢查:
另一個方向也成立:
若材料總量是十支鉛筆、三張卡紙,就有
因此是三包甲包、四包乙包。回到原配方檢查:
可逆,不等於每組材料總量都是可行的包裝方案
數學上的逆運算成立後,應用問題仍要檢查包數是否為非負整數。
在這個固定配方中,
所以,要得到非負整數包數,材料總量必須滿足
當 時,,表示只用甲包;當 時,,表示只用乙包。兩種材料總量都為零時,還原結果就是 。
相反地,若輸入 ,反矩陣仍會給出唯一實數解
而且代回兩條式子確實成立。但「負一包乙包」不是可執行的包裝方案。
反矩陣保證的是實數範圍內的代數還原;現實可行性還要另外檢查。
不能反推,有時不是算得慢,而是資訊不夠
考慮另一個二階矩陣
它的輸出關係是
表面上記了兩個輸出,第二個卻只是第一個的兩倍,沒有提供另一項可以區分輸入的資訊。
例如,兩組不同的輸入
都得到
只拿到 ,不可能用一個確定的反向規則,同時還原成這兩個不同的原始輸入。這不是多按幾次計算機就能解決的問題。
而且,不是每一對輸出都有對應的輸入。例如 不符合 ,就不可能由這個矩陣產生。沒有反矩陣,不等於每組輸出都對應很多輸入;有些輸出根本產生不了。
本例恰好有
對二階實矩陣,可逆的條件恰好就是 。為什麼等於零時一定不行?可以把零值與退化情形一起看清楚。
若第一列 不全為零,則 是非零輸入,而且在 時,
它與零輸入產生相同輸出,無法唯一還原。
若第一列全為零、第二列 不全為零,則改用非零輸入 :
若兩列全為零,所有輸入更都得到零輸出。
因此,在所有實數輸入的範圍內, 時不存在能全面還原輸入的反矩陣。另加現實限制後,某一筆資料可能碰巧只剩一個可行方案,但這不會使原矩陣因此變成可逆。
反矩陣所分辨的,是一組規則有沒有保留足以全面、唯一還原輸入的資訊。矩陣可以把許多量組織起來,卻不保證每一種組織方式都可逆。
七、把運算交給電腦,把判斷責任留下來
只要輸入與規則確定,矩陣運算就適合交給電腦重複執行。但「電腦有輸出」與「答案值得相信」,中間還隔著尺寸、順序、資料解釋和數值檢查。
以下使用 Python 的 NumPy 套件示範。對這裡使用的二維陣列,A @ B 表示矩陣乘積;* 則用來作逐元素相乘或係數積,不能把 A * B 當成 A @ B。本例的 尺寸也不適合直接逐元素相乘。NumPy
還有一個記號差別要先知道:本文的數學下標從 開始,NumPy 的陣列索引從 開始。因此,數學上的 ,在這份程式中要讀取 P[1, 1];M[0, 0] 則是 左上角的元素。這只是索引起點不同,不是把橫列與直行交換。NumPy
在已備妥 Python 與 NumPy 的教學環境中,將下列完整輸入保存為 ALG09_matrix_audit.py:
import platform
import numpy as np
# A:橫列依序是鉛筆、卡紙;直行依序是甲包、乙包、丙包。
A = np.array([[2, 1, 0],
[1, 0, 3]], dtype=np.int64)
# B、D:橫列依序是甲包、乙包、丙包;直行依序是一班、二班。
B = np.array([[3, 2],
[4, 1],
[2, 5]], dtype=np.int64)
D = np.array([[1, 0],
[0, 1],
[1, 2]], dtype=np.int64)
# M:另一次只使用甲包、乙包;輸出仍依序是鉛筆、卡紙。
M = np.array([[2, 1],
[1, 0]], dtype=np.float64)
if B.shape != D.shape:
raise ValueError("線性組合的兩個矩陣必須同型。")
if A.shape[1] != B.shape[0]:
raise ValueError("AB 的內側尺寸不相等;請回查資料標籤。")
if M.shape != (2, 2):
raise ValueError("本示範只允許二階反矩陣。")
# 本例的 M 使用可精確表示的小整數;這不是一般近似資料的判定程序。
delta = M[0, 0] * M[1, 1] - M[0, 1] * M[1, 0]
if delta == 0:
raise ValueError("本二階矩陣不可逆。")
L = 2 * B - D
P = A @ B
R = np.linalg.inv(M)
print("Python:", platform.python_version())
print("NumPy:", np.__version__)
print("A.shape, B.shape, P.shape =", A.shape, B.shape, P.shape)
print("2B-D =", L.tolist())
print("AB =", P.tolist())
print("det(M) =", float(delta))
print("M_inverse =", R.tolist())
print("M @ M_inverse =", (M @ R).tolist())
print("M_inverse @ M =", (R @ M).tolist())
在檔案所在資料夾執行:
python ALG09_matrix_audit.py
要把輸出另存為文字紀錄,可以執行:
python ALG09_matrix_audit.py > ALG09_matrix_audit_output.txt
第二個指令會把原本顯示在終端機的正常輸出寫入指定檔案。保存時應同時保留程式與輸出,不能只留下最後的答案矩陣。
這份程式本次實際執行得到:
Python: 3.13.5 NumPy: 2.3.5 A.shape, B.shape, P.shape = (2, 3) (3, 2) (2, 2) 2B-D = [[5, 4], [8, 1], [3, 8]] AB = [[10, 5], [9, 17]] det(M) = -1.0 M_inverse = [[0.0, 1.0], [1.0, -2.0]] M @ M_inverse = [[1.0, 0.0], [0.0, 1.0]] M_inverse @ M = [[1.0, 0.0], [0.0, 1.0]]
版本號是這次執行環境的紀錄,不表示每個環境都必須顯示相同版本。
人工稽核至少要能指定一格,說明它從哪裡來。例如,輸出矩陣的第 列、第 行是 ,我們不用任何矩陣函式,也能從原資料證明:
這不只是核對「螢幕上也有 17」,而是核對它確實表示二班所需的卡紙張數。
若結果不一致,應回查保存的原始輸入、橫列與直行順序,以及是否仍在計算 A @ B,不要先把輸出手動改成預期答案。若尺寸不相容,也不要為了消除錯誤訊息就任意補零或改排列;應先查出哪個分類沒有接上。
這份程式針對的是本文固定的小整數資料;其中行列式的計算得到可精確表示的 。不能直接把 delta == 0 搬去當成所有近似小數資料的可靠判定方法。
其他問題若使用近似小數,電腦求出的反矩陣可能受到浮點誤差影響。NumPy 官方文件提醒:某些數值上不穩定的情形,即使沒有報錯,求逆結果仍可能不準確。因此,不能把「程式執行成功」或「顯示的乘積接近單位矩陣」當成一般性的精確數學證明。NumPy
八、今天仍然重要的,是整批資料背後的共同規則
矩陣對今天的影響,可以從一個具體的運算元件看見,而不必只背誦產業名稱。
例如,PyTorch 的 Linear 元件,使用一組係數把多個輸入加權、加總,形成多個輸出;預設還包含可學習的額外加項,設定 bias=False 才不使用這個加項。這些係數與加項在一次固定的計算中有確定值,但在訓練過程中可以更新。PyTorch Documentation
先只看不含額外加項的乘法部分。用本文的排列方式理解,可以把一筆資料的多個數放成一個直行,把不同資料並排成一張矩陣,再由同一張係數表處理它們。其共同機制,正如 對 的每個班級使用相同的材料配方。
這是運算結構的連結,不表示材料包與人工智慧模型是同一種現實問題。它也不表示一個實際模型只需要一張矩陣,或算出數字就能保證判斷正確。
它指出的是一個確切連結:
同一套「多個輸入如何組成多個輸出」的規則,可以對一整批資料一致地執行。
軟體的資料排列方向仍須另外核對。PyTorch 文件把每筆資料的特徵放在最後一個維度,不能直接把本文「一筆資料放成一個直行」的配置原封不動搬進介面。加入額外加項後,也不再只是本文所算的單一矩陣乘積。PyTorch Documentation
回頭看,矩陣帶來的能力有清楚的界線。
它讓我們把多個量放進有位置的結構,讓同類資料能按位置合併,讓共同分類能透過乘法接合,也讓可逆性成為可以檢查的條件。但是,它不會替我們決定標籤是否正確、假設是否合理,也不會把已經混失的資訊重新變出來。
學會矩陣之後,你應該不只會照規則求出幾格數字,而能先問:
這個位置代表誰?這兩張表在接合什麼?乘法方向有沒有保留原來的作用順序?算出的結果能不能回到資料中解釋?需要倒推時,原規則究竟有沒有保留足夠資訊?
從這些問題出發,矩陣就不再只是一種排列數字的方法,而是一種組織、連接並檢查多個量之間關係的方法。