# 線性代數
{%hackmd @themes/orangeheart %}
<style>
.likecoin-button {
position: relative;
width: 100%;
max-width: 485px;
max-height: 240px;
margin: 0 auto;
}
.likecoin-button > div {
padding-top: 49.48454%;
}
.likecoin-button > iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
</style>
###### tags: `Numerical Methods`
對於數值分析領域的研究者來說,線性代數是一個非常好的工具。它不僅可以協助我們將繁雜的數學式進行化簡(例如方程組轉換成矩陣的形式,並利用 Cramer's Rule 求解),同時也能夠利用線性代數的各種性質推廣數值分析上重要的內涵。
## `Symbolics`套件與變數設定
在安裝完套件後,我們可以先對符號進行定義,也就是將其令為**變數(variables)**。
```julia
using Symbolics
@variables a b c d e f g h i j k l m n;
```
不過,為什麼要進行上面的步驟呢?我們來做個實驗,如果在 kernel 上面打上 `p` 會出現什麼呢?
```julia
UndefVarError: p not defined
Stacktrace:
[1] top-level scope
@ :0
[2] eval
@ .\boot.jl:373 [inlined]
[3] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
@ Base .\loading.jl:1196
```
很明顯的,因為我們還未定義 `p` 在這個程式裡面的意義,因此 $\texttt{Julia}$ 不會知道這個 `p` 是一個變數。設定完成之後,我們可以隨意打上我們剛剛設定的那些符號,它就會顯示為數學符號(也就是 $\LaTeX$)的形式了。
```julia
a
```
它就會跑出
$$
a
$$
## 向量(vector)
給定兩個欄向量(column vector) $M_1$ 與 $N_1$,
```julia
a = [m₁; m₂; m₃]
b = [n₁; n₂; n₃]
a |> display
b |> display
```
$$
a =
\begin{bmatrix}
m_1\\m_2\\m_3
\end{bmatrix}, \qquad
b =
\begin{bmatrix}
n_1\\n_2\\n_3
\end{bmatrix}
$$
### 內積(inner product)
若將兩向量進行內積,就會得到一個純量,即
```julia
a' * b |> display
```
$$
a \cdot b = \begin{bmatrix}
m_1&m_2&m_3
\end{bmatrix}
\begin{bmatrix}
n_1\\n_2\\n_3
\end{bmatrix}
= m_1n_1 + m_2n_2 + m_3n_3
$$
上述的結果也可以透過逐元的方式計算:
```julia
sum(m1 .* n1) |> display
```
### 正交(orthogonal)
如果說兩個向量的內積為 $0$,則我們說這兩個向量相互垂直(orthogonal),或稱為正交的。
```julia
u = [3; 2; 1]
v = [-2; 3; 0]
u'v |> display
## 0
```

### 範數(norm)
而向量的範數是一個計算向量長度的方式,其計算方式為
$$
\|m\| = \sqrt{M'M}\\
$$
```julia
m1_norm = sqrt(m1' * m1)
```
會得到
$$
\sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}}
$$
若其長度為 $1$,則我們稱該向量為標準化向量。
```julia
m1_normalized = m1 ./ m1_norm
m1_normalized_norm = sqrt(m1_normalized' * m1_normalized)
m1_normalized |> display
m1_normalized_norm |> display
```
會得到標準化過後的向量為
$$
\begin{bmatrix}
\frac{m{_1}}{\sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}}} \\
\frac{m{_2}}{\sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}}} \\
\frac{m{_3}}{\sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}}} \\
\end{bmatrix}
$$
其長度為
$$
\sqrt{\frac{m{_1}^{2}}{\left( \sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}} \right)^{2}} + \frac{m{_2}^{2}}{\left( \sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}} \right)^{2}} + \frac{m{_3}^{2}}{\left( \sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}} \right)^{2}}}
$$
經過化簡可得其長度為 $1$
```julia
simplify.(expand.(m1_normalized_norm))
```
$$
\sqrt{\frac{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}}{\left( \sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}} \right)^{2}}} = 1
$$
而在計量經濟學中,我們最常使用的性質是**標準正交(orthonormal)**:若兩個向量相互垂直且均經過標準化,則稱這兩個向量具有標準正交的性質。
### 外積(outer product)
若將兩向量進行外積,就會得到一個張量(tensor),即
```julia
a * b' |> display
```
$$
a \times b' =
\begin{bmatrix}
m_1\\m_2\\m_3
\end{bmatrix}
\begin{bmatrix}
n_1 & n_2 & n_3
\end{bmatrix}=
\begin{bmatrix}
m_{1} n_{1} & m_{1} n_{2} & m_{1} n_{3} \\
m_{2} n_{1} & m_{2} n_{2} & m_{2} n_{3} \\
m_{3} n_{1} & m_{3} n_{2} & m_{3} n_{3}
\end{bmatrix}
$$
## 矩陣(matrix)
根據維基百科的定義,數學上,一個${m\times n}$的矩陣是一個由$m$列(row)$n$行(column)元素排列成的矩形陣列,如果用英文表達,就是一個 $m$ by $n$ 的矩陣。矩陣裡的元素可以是數字、符號或數學式。[^1]我們來看看下面的例子:
```julia
## 2 x 2 的矩陣
A = [a b; c d]
## 2 x 3 的矩陣
B = [a b c
d e f]
## 3 x 2 的矩陣
C = [a b; c d; e f]
A |> display
B |> display
C |> display
```
它便會顯示
$$
\begin{bmatrix}
a & b \\
c & d \\
\end{bmatrix}\\
\begin{bmatrix}
a & b & c\\
d & e & f
\end{bmatrix}\\
\begin{bmatrix}
a & b \\
c & d \\
e & f
\end{bmatrix}
$$
### 矩陣的符號表示
我們會以大寫(或粗體)的字母表示矩陣,例如 $\mathbf{A}$;利用小寫的字母代表矩陣內的元素,例如 $a$。注意到,在矩陣中為了清楚定義是哪一個元素,我們會利用以下的方式進行註記。
$$
\mathbf{A}_{i,j}
$$
其中下標(subscript) $i$ 代表行,$j$ 代表列。如果我們要找到上面設定的矩陣 $\mathbf{B}$ 中第二列第三個元素,也就是 $f$,要怎麼輸入呢?
```julia
@show B[2, 3]
```
顯示
$$
f
$$
### 矩陣的四則運算
如果我們要將兩個矩陣進行相加,我們可寫成:
```julia
[a b
c d] + [e f
g h]
```
其計算結果很直觀地可以猜想到是
$$
\begin{bmatrix}
a + e & b + f\\
c + g & d + h
\end{bmatrix}
$$
而有趣地是,在 $\texttt{Julia}$ 中,我們可以將兩個不同維度(dimension)的矩陣進行相加總,不過必須利用**逐元(element-wise)**的方式進行運算。[^2]例如
```julia
[a b
c d] .+ [e
g]
```
結果會是
$$
\begin{bmatrix}
a + e & b + e \\
c + g & d + g \\
\end{bmatrix}
$$
接著我們來看一下乘積。首先定義兩個矩陣,$\mathbf{A}_1$ 與 $\mathbf{A}_2$。
```julia
A1 = [a b; c d]
A2 = [e f; g h]
```
如果我們要計算兩個矩陣相乘,即 $\mathbf{A}_1 \cdot \mathbf{A}_2$;或是在矩陣前方乘上一個純量(scalar),也就是 $c \cdot \mathbf{A}_1$,我們可以這麼做:
```julia
A12 = A1 * A2 # 兩個矩陣相乘
A3 = 3 * A1 # 純量乘上矩陣
```
結果就是
$$
\mathbf{A}_1 \cdot \mathbf{A}_2 = \begin{bmatrix}
a e + b g & a f + b h \\
c e + d g & c f + d h \\
\end{bmatrix}\\
3 \cdot \mathbf{A}_1 = \begin{bmatrix}
3 a & 3 b \\
3 c & 3 d \\
\end{bmatrix}\\
$$
同樣地,我們也可以運用 $\texttt{Julia}$ 中逐元的性質對矩陣進行乘積。例如
```julia
A3 = A1 .* A2 # 進行逐元乘積
```
則 $\mathbf{A}_3$ 會等於
$$
\begin{bmatrix}
a e & b f \\
c g & d h \\
\end{bmatrix}
$$
注意到,如果我們對 $\mathbf{A}_1$ 與 $\mathbf{A}_2$ 的乘積進行交換,其結果在數學上與在 $\texttt{Julia}$ 上均是不成立的,這部分就留給讀者自行證明。
```julia
A21 = A2 * A1
```
會得到
$$
\mathbf{A}_2 \cdot \mathbf{A}_1 = \begin{bmatrix}
a e + c f & b e + d f \\
a g + c h & b g + d h \\
\end{bmatrix}
$$
值得一提的是,給定兩個矩陣,其中 $\mathbf{X}_1$ 為一個 $p \times q$ 的矩陣,$\mathbf{X}_2$ 則是一個 $s \times t$ 的矩陣。而只有在 $q = s$時,兩個矩陣才能進行乘積,並得到一個新的矩陣 $\mathbf{X}_3$,且為一 $p \times t$ 的矩陣。
### 行列式
行列式(determinant),記作 $\det(\mathbf{A})$ 或 $|\mathbf{A}|$,是一個在方陣上計算得到的純量。[^3]如果要進行計算的話,首先要引入套件 `LinearAlgebra`,接著利用指令 `det()` 計算行列式。
```julia
using LinearAlgebra
A |> display
@show det(A)
```
結果會是
$$
\begin{bmatrix}
a & b \\
c & d \\
\end{bmatrix}\\
\texttt{det}(\mathbf{A}) = ad - bc
$$
如果考慮以下矩陣 $\mathbf{D}$
$$
\begin{bmatrix}
a & b & c \\
d & e & f \\
g & h & i \\
\end{bmatrix}
$$
則其行列式為
$$
\texttt{det}(\mathbf{D}) = c \left( d h - e g \right) + a \left( e i - f h \right) - b \left( d i - f g \right)
$$
其實到了高維的矩陣,可以看到行列式的計算變得複雜,因此我們可以利用 `expand.()` 的指令,將計算過程展開,了解其背後的運作、計算過程與原理。
```julia
@show expand.(det(D))
## b*f*g + a*e*i + c*d*h - b*d*i - c*e*g - a*f*h
```
有關乘法,我們要注意一件事:$\mathbf{AB = AC}$ 並不隱含 $\mathbf{B = C}$。
```julia
a1 = [1 2; 2 4]
b1 = [2 1; 1 3]
c1 = [4 3; 0 2]
@show a1 * b1
@show a1 * c1
## a1 * b1 = [4 7; 8 14]
## a1 * c1 = [4 7; 8 14]
```
另外給定 $\mathbf{A}$、$\mathbf{B}$ 與 $\mathbf{C}$ 三個矩陣,如果 $\mathbf{A}(\mathbf{BC}) = (\mathbf{AB})\mathbf{C}$,那麼我們就稱其符合結合律。
```julia
A*(B*C) |> display
(A*B)*C |> display
```
輸出的結果如下:
$$
\begin{bmatrix}
a \left( a^{2} + b c + c e \right) + b \left( a d + c e + e f \right) & a \left( a b + b d + c f \right) + b \left( b d + d e + f^{2} \right) \\
c \left( a^{2} + b c + c e \right) + d \left( a d + c e + e f \right) & c \left( a b + b d + c f \right) + d \left( b d + d e + f^{2} \right) \\
\end{bmatrix}\\
\begin{bmatrix}
a \left( a^{2} + b d \right) + c \left( a b + b e \right) + e \left( a c + b f \right) & b \left( a^{2} + b d \right) + d \left( a b + b e \right) + f \left( a c + b f \right) \\
a \left( a c + d^{2} \right) + c \left( b c + d e \right) + e \left( c^{2} + d f \right) & b \left( a c + d^{2} \right) + d \left( b c + d e \right) + f \left( c^{2} + d f \right) \\
\end{bmatrix}
$$
但基本上由上面的結果我們很難看出兩者到底是不是相同的,因此我們可利用 `simplify.()` 的指令,配合上面使用過的 `expand.()`,將其進行展開後化簡成最易讀的形式。
```julia
simplify.(expand.(A*(B*C))) |> display
simplify.(expand.((A*B)*C)) |> display
```
$$
\begin{bmatrix}
a^{3} + a b \left( c + d \right) + b e f + c e \left( a + b \right) & b \left( a^{2} + f^{2} \right) + b^{2} d + a b d + b d e + a c f \\
d^{2} a + a^{2} c + c^{2} \left( b + e \right) + c d e + d e f & c^{2} f + d^{2} \left( b + e \right) + f^{2} d + a b c + b c d \\
\end{bmatrix}\\
\begin{bmatrix}
a^{3} + a b \left( c + d \right) + b e f + c e \left( a + b \right) & b \left( a^{2} + f^{2} \right) + b^{2} d + a b d + b d e + a c f \\
d^{2} a + a^{2} c + c^{2} \left( b + e \right) + c d e + d e f & c^{2} f + d^{2} \left( b + e \right) + f^{2} d + a b c + b c d \\
\end{bmatrix}
$$
### 單位矩陣(identity matrix)
單位矩陣就是一個 $n \times n$ 的方陣,其主對角線(main diagonal)上的元素均為 $1$,其餘元素為 $0$。以一個 $4 \times 4$ 的單位矩陣 $\mathbf{I}_4$ 為例,其可寫作
$$
\begin{bmatrix}
1 & 0\\
0 & 1
\end{bmatrix}
$$
注意到,如果我們將單位矩陣與其他矩陣相乘,其是具有交換律的,且結果會等於被乘矩陣,即 $\mathbf{AI = A = IA}$。
```julia
Imat = [1 0; 0 1]
A * Imat |> display
Imat * A |> display
```
$$
\begin{bmatrix}
a & b\\
c & d
\end{bmatrix}\\
\begin{bmatrix}
a & b\\
c & d
\end{bmatrix}
$$
### 對角矩陣(diagonal matrix)
若一個矩陣主對角線之外的元素皆為 $0$,那麼我們就稱其為對角矩陣。例如
```julia
d = [a 0 0; 0 b 0; 0 0 c]
```
$$
\begin{bmatrix}
a & 0 & 0\\
0 & b & 0\\
0 & 0 & c
\end{bmatrix}
$$
如果兩個對角矩陣相乘,其結果也會是一個對角矩陣。
```julia
D1 = [1 0 0; 0 2 0; 0 0 3]
D2 = [4 0 0; 0 5 0; 0 0 6]
D1D2 = D1 * D2
D1 |> display
D2 |> display
D1D2 |> display
```
結果會是
$$
\begin{bmatrix}
4 & 0 & 0\\
0 & 10 & 0\\
0 & 0 & 18
\end{bmatrix}
$$
### 三角矩陣(triangular matrix)
其分為上三角與下三角矩陣,前者的對角線左下方元素為 $0$,後者則是對角線右上方元素為 $0$。
```julia
UT = [a b c; 0 d e; 0 0 f]
LT = [a 0 0; b c 0; d e f]
UT |> display
LT |> display
```
得到上三角矩陣
$$
\begin{bmatrix}
a & b & c\\
0 & d & e\\
0 & 0 & f
\end{bmatrix}
$$
與下三角矩陣
$$
\begin{bmatrix}
a & 0 & 0\\
b & c & 0\\
d & e & f
\end{bmatrix}
$$
同樣地,我們將三角矩陣相乘的結果仍會是三角矩陣。
```julia
UT * UT |> display
```
$$
\begin{bmatrix}
a^{2} & a b + b d & a c + b e + c f \\
0 & d^{2} & d e + e f \\
0 & 0 & f^{2} \\
\end{bmatrix}
$$
### 轉置矩陣(transpose of matrix)
簡單來說,轉置矩陣就是將行、列進行交換。下面定義 $\mathbf{M}$ 與 $\mathbf{N}$ 兩個矩陣,並對 $\mathbf{M}$ 取轉置矩陣,在數學上我們記做 $\mathbf{M}^{\top}$ 或 $\mathbf{M}'$。
```julia
@variables m₁₁ m₁₂ m₁₃ m₂₁ m₂₂ m₂₃ m₁ m₂ m₃
M = [ m₁₁ m₁₂ m₁₃
m₂₁ m₂₂ m₂₃ ]
@variables n₁₁ n₁₂ n₁₃ n₂₁ n₂₂ n₂₃ n₃₁ n₃₂ n₁ n₂ n₃
N = [ n₁₁ n₁₂
n₂₁ n₂₂
n₃₁ n₃₂ ]
M |> display
M' |> display
```
$$
\begin{bmatrix}
m{_{11}} & m{_{12}} & m{_{13}} \\
m{_{21}} & m{_{22}} & m{_{23}} \\
\end{bmatrix}\\
\begin{bmatrix}
m{_{11}} & m{_{21}} \\
m{_{12}} & m{_{22}} \\
m{_{13}} & m{_{23}} \\
\end{bmatrix}
$$
而轉置矩陣有下列的性質。如果將矩陣進行轉置,再對其進行一次轉置,我們會得到原本的矩陣:
$$
(\mathbf{M}')' = \mathbf{M}
$$
如果我們將兩個矩陣相加再轉置,可以寫成兩個矩陣先進行轉置後再進行相加
$$
(\mathbf{M} + \mathbf{N})' = \mathbf{M}' + \mathbf{N}'
$$
而兩個矩陣先進行相乘再轉至,其結果為
$$
(\mathbf{MN})' = \mathbf{N}'\mathbf{M}'
$$
道理很簡單,我們令 $\mathbf{M}$ 為一個 $m \times n$ 的矩陣,$\mathbf{N}$ 為一個 $n \times m$ 的矩陣,兩者相乘的結果會是 $m \times m$ 的結果。而如果將 $\mathbf{M}$ 轉置,會得到一個 $n \times m$ 的矩陣,將$\mathbf{N}$ 進行轉置則會得到一個 $m \times n$ 的矩陣,故若為 $\mathbf{M}'\mathbf{N}'$,其結果會是一個 $n \times n$ 的矩陣;如果是 $\mathbf{N}'\mathbf{M}'$,則會是 $m \times m$ 的矩陣。
```julia
(M*N)' |> display
N'M' |> display
M'N' |> display
```
$$
\begin{bmatrix}
m{_{11}} n{_{11}} + m{_{12}} n{_{21}} + m{_{13}} n{_{31}} & m{_{21}} n{_{11}} + m{_{22}} n{_{21}} + m{_{23}} n{_{31}} \\
m{_{11}} n{_{12}} + m{_{12}} n{_{22}} + m{_{13}} n{_{32}} & m{_{21}} n{_{12}} + m{_{22}} n{_{22}} + m{_{23}} n{_{32}} \\
\end{bmatrix}\\
\begin{bmatrix}
m{_{11}} n{_{11}} + m{_{12}} n{_{21}} + m{_{13}} n{_{31}} & m{_{21}} n{_{11}} + m{_{22}} n{_{21}} + m{_{23}} n{_{31}} \\
m{_{11}} n{_{12}} + m{_{12}} n{_{22}} + m{_{13}} n{_{32}} & m{_{21}} n{_{12}} + m{_{22}} n{_{22}} + m{_{23}} n{_{32}} \\
\end{bmatrix}\\
\begin{bmatrix}
m{_{11}} n{_{11}} + m{_{21}} n{_{12}} & m{_{11}} n{_{21}} + m{_{21}} n{_{22}} & m{_{11}} n{_{31}} + m{_{21}} n{_{32}} \\
m{_{12}} n{_{11}} + m{_{22}} n{_{12}} & m{_{12}} n{_{21}} + m{_{22}} n{_{22}} & m{_{12}} n{_{31}} + m{_{22}} n{_{32}} \\
m{_{13}} n{_{11}} + m{_{23}} n{_{12}} & m{_{13}} n{_{21}} + m{_{23}} n{_{22}} & m{_{13}} n{_{31}} + m{_{23}} n{_{32}} \\
\end{bmatrix}
$$
### 對稱矩陣與反對稱矩陣
若一個矩陣之轉置矩陣仍是其自己本身,那麼其便符合對稱矩陣的性質,即 $A' = A$。
```julia
S = [a b c; b d e; c e f]
S |> display
S' |> display
```
$$
\begin{bmatrix}
a & b & c \\
b & d & e \\
c & e & f \\
\end{bmatrix}\\
\begin{bmatrix}
a & b & c \\
b & d & e \\
c & e & f \\
\end{bmatrix}
$$
而反對稱矩陣則是其轉置矩陣與自身的加法反元素相等,即
$$
\mathbf{A}' = -\mathbf{A}
$$
```julia
SS = [0 b c; -b 0 e; -c -e 0]
SS |> display
SS' |> display
```
$$
\begin{bmatrix}
0 & b & c \\
-b & 0 & e \\
-c & -e & 0 \\
\end{bmatrix}\\
\begin{bmatrix}
0 & -b & -c \\
b & 0 & -e \\
c & e & 0 \\
\end{bmatrix}
$$
注意到,如果一個矩陣的轉置矩陣乘上該矩陣,結果會是一個對稱矩陣,即
$$
\mathbf{A}'\mathbf{A}
$$
```julia
A' * A |> display
B' * B |> display
```
$$
\begin{bmatrix}
a^{2} + c^{2} & a b + c d \\
a b + c d & b^{2} + d^{2} \\
\end{bmatrix}\\
\begin{bmatrix}
a^{2} + d^{2} & a b + d e & a c + d f \\
a b + d e & b^{2} + e^{2} & b c + e f \\
a c + d f & b c + e f & c^{2} + f^{2} \\
\end{bmatrix}
$$
### 反矩陣(inverse matrix)
給定一個 $n$ 階方陣 $\mathbf{A}$,若存在一 $n$ 階方陣 $\mathbf {B}$,使得 $\mathbf{AB}=\mathbf{BA}=\mathbf{I}_n$,其中 $\mathbf{I}_n$ 為 $n$ 階單位矩陣,則稱 $\mathbf{A}$ 是可逆的,且 $\mathbf {B}$ 是 $\mathbf{A}$ 的逆矩陣,記作 $\mathbf {A} ^{-1}$。但並非所有矩陣都可以取反矩陣,如果其行列式等於 $0$時,便不能取反矩陣。原因是因為如果矩陣 $\mathbf{A}$ 可逆,則 $\mathbf{A}^{-1} = \frac{\operatorname{adj}(A)}{\det(A)}$,其中 $\operatorname{adj}(A)$ 為矩陣 $\mathbf{A}$ 的伴隨矩陣(adjugate matrix),故若行列式的值為 $0$,此等式就會無意義。根據上述性質,可得出以下小結論:若矩陣 $\mathbf{A}$ 可逆,則
$$
\mathbf{A}\mathbf{A}^{-1} = \mathbf{I} = \mathbf{A}^{-1}\mathbf{A}
$$
```julia
A * inv(A)
```
得到
$$
\begin{bmatrix}
1 & 0 \\
\frac{c \left( true + \frac{b \frac{c}{a}}{d + \frac{ - b c}{a}} \right)}{a} + \frac{ - d \frac{c}{a}}{d + \frac{ - b c}{a}} & \frac{d}{d + \frac{ - b c}{a}} + \frac{ - c \frac{b}{d + \frac{ - b c}{a}}}{a} \\
\end{bmatrix}
$$
經過化簡可以得到
```julia
simplify.(expand.(A * inv(A))) |> display
simplify.(expand.(inv(A) * A)) |> display
```
兩者結果均是
$$
\mathbf{I} =
\begin{bmatrix}
1 & 0 \\
0 & 1 \\
\end{bmatrix}
$$
而反矩陣有以下性質:
$$
\begin{aligned}
(\mathbf{AB})^{-1} = \mathbf{B}^{-1}\mathbf{A}^{-1}\\
(\mathbf{A}^{\top})^{-1} = (\mathbf{A}^{-1})^{\top}
\end{aligned}
$$
```julia
simplify.(expand.(inv(A'))) |> display
simplify.(expand.(inv(A)')) |> display
```
輸出結果均為
$$
\begin{bmatrix}
\frac{d}{a d - b c} & \frac{ - c}{a d - b c} \\
\frac{ - b}{a d - b c} & \frac{a}{a d - b c} \\
\end{bmatrix}
$$
那我們要怎麼手刻反矩陣呢?根據上面的定義,
$$
\mathbf{A}\mathbf{A}^{-1} = \mathbf{I}
$$
其實可以把反矩陣令為一個未知矩陣 $\mathbf{X}$,因此可以寫成
$$
\mathbf{A}\mathbf{X}=\mathbf{I}
$$
而利用反斜線(backslash)的運算符,我們可以計算出反矩陣,即
```julia
X = A\I
```
結果會是
$$
\begin{bmatrix}
\frac{1 + \frac{b \frac{c}{a}}{d + \frac{ - b c}{a}}}{a} & \frac{ - \frac{b}{d + \frac{ - b c}{a}}}{a} \\
\frac{ - \frac{c}{a}}{d + \frac{ - b c}{a}} & \frac{1}{d + \frac{ - b c}{a}} \\
\end{bmatrix}
$$
經過化簡與檢查,確定該算法可得出反矩陣:
```julia
simplify.(expand.(inv(A))) |> display
simplify.(expand.(A \ I_mat)) |> display
```
$$
\begin{bmatrix}
\frac{d}{a d - b c} & \frac{ - b}{a d - b c} \\
\frac{ - c}{a d - b c} & \frac{a}{a d - b c} \\
\end{bmatrix}
$$
[^1]:參考自[維基百科──矩陣](https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%98%B5)
[^2]:注意到在數學上這件事是不成立的。
[^3]:參考自[維基百科──行列式](https://zh.wikipedia.org/wiki/%E8%A1%8C%E5%88%97%E5%BC%8F)
<div class="likecoin-embed likecoin-button">
<div></div>
<iframe scrolling="no" frameborder="0" src="https://button.like.co/in/embed/xiaolong70701/button?referrer=hackmd.io"></iframe>
</div>