關鍵詞:線性代數 / 矩陣 / 運算
今天小編將詳細介紹矩陣的運算規則與數學符號應用在矩陣上的含義,如同算數字的加減法需要了解計算公式的規則一樣,矩陣的運算雖然與單純數字運算相似,但其細節的相異處還需要多加注意。另外,矩陣計算有些時候手算和代碼算的規則是有些差異的,這也容易造成算法在實際部署時的 BUG,接下來的矩陣操作介紹,小編將完全站在編程的角度去重新闡述線性代數的理論知識!
矩陣的基本性質回顧一下一個矩陣的具體寫法與符號定義:
import numpy as np
from Code.linalg import *如果還沒安裝過numpy,可以使用下面指令在終端快速安裝。
pip install numpy如果想獲得Code.linalg裡面的代碼,歡迎掃碼進群!
1. 矩陣的相等如果 A 與 B 兩個矩陣的階數相等,所對應的元素也都相等,則稱 A 與 B 矩陣相等。
2. 加減法如果兩個矩陣的階數都相等,則加減法即為對應位置的元素相加減。
A = np.random.randint(0, 5, 6).reshape(2, 3)
B = np.random.randint(0, 5, 6).reshape(2, 3)
C = np.random.randint(0, 8, 6).reshape(3, 2)
print(A, '\n\n', B, '\n\n', C)
print(A + B)輸出 (1):
[[0 1 1]
[3 1 0]]
[[1 1 0]
[2 2 0]]
[[2 2]
[2 2]
[1 1]]輸出 (2):
[[1 2 1]
[5 3 0]]
3. 純量與矩陣的乘積如果 A 為矩陣而 k 為常數,相乘的結果即為每個 A 內的元素都乘以 k。
print(10 * A)輸出:
[[ 0, 10, 10],
[30, 10, 0]]
4. 矩陣的乘法如果兩個矩陣的 行數 與另一個矩陣的 列數 相等,矩陣乘法才可行,此操作又稱為內積。
print(np.dot(A, A.T))輸出:
[[ 2, 1],
[ 1, 10]]有些在數字上通用的乘法規則,在矩陣中則無效,如下實例:交換律不成立,成立條件:
消去律不成立
如果 A 與 B 皆為 n 階方陣,AB = AC 不表示 B = C,成立條件:
為 0 條件
如果 AB = 0,不恆表示 A = 0 或是 B = 0。成立條件:
結合律成立
5. 轉置矩陣的性質轉置操作從二維矩陣的角度看,就是把矩陣沿著對角線做一個 180 度的翻轉,長寬的尺寸維度也因此跟著變化。如果是高維張量的轉置操作,則可以理解成是不同維度的值調換了位置,更多細節將在後面幾個章節細說!
print(A == A.T.T)輸出:
[[ True, True, True],
[ True, True, True]]print((A + B).T == A.T + B.T)輸出:
[[ True, True],
[ True, True],
[ True, True]]print((10 * A).T == 10 * A.T)輸出:
[[ True, True],
[ True, True],
[ True, True]]證明:
得證。
print(np.dot(A, C).dot(B).T == np.dot(B.T, C.T).dot(A.T))輸出:
[[ True, True],
[ True, True],
[ True, True]]
6. 共軛轉置矩陣的性質共軛轉置操作就跟名字起的順序一樣,先做共軛再做轉置,數學上計作 上標
print(conj_T(conj_T(A)) == A)輸出:
[[ True, True, True],
[ True, True, True]]print(conj_T(A + B) ==
conj_T(A) + conj_T(B))輸出:
[[ True, True],
[ True, True],
[ True, True]]print(conj_T(10 * A) == 10 * conj_T(A))輸出:
[[ True, True],
[ True, True],
[ True, True]]print(conj_T(np.dot(A, C).dot(B)) == np.dot(
conj_T(B), conj_T(C)).dot(conj_T(A)))輸出:
[[ True, True],
[ True, True],
[ True, True]]
7. 對稱矩陣與反對稱矩陣的性質如果 A 是 n 階方陣,則有:
證明:
print(np.dot(A, A.T))輸出:
[[ 2, 1],
[ 1, 10]]print(np.dot(A.T, A))輸出:
[[9, 3, 0],
[3, 2, 1],
[0, 1, 1]]證明:
D = np.random.randint(0, 10, 9)
D = D.reshape(3, 3)
print(D) # random square matrix輸出:
[[8, 8, 6],
[2, 9, 0],
[2, 2, 6]]print((D + D.T).T)輸出:
[[16, 10, 8],
[10, 18, 2],
[ 8, 2, 12]]證明:
print((D - D.T).T)輸出:
[[ 0, -4, -6],
[ 4, 0, -6],
[ 6, 6, 0]]
任何 n 階實數方陣必定可以表示成 對稱矩陣 與 反對稱矩陣 的和: