# 資研 4/19 社課講義
[**提問表單**](https://forms.gle/z4dPC1JPV6uA2q9w7)
---
## 矩陣
### 定義
當一個 $m*n$ 的矩陣,有 $m$ 列、 $n$ 行
>直行橫列
### 零矩陣
可記為 $O_{m*n}$ ,且全部的數字皆為 $0$
$e.g.\ O_{1*3} = \left[
\begin{array}{ccc}
0 &&0 &&0 \\
\end{array}\right]$
$e.g.\ O_{2*4} = \left[
\begin{array}{cccc}
0 &&0 &&0 &&0 \\
0 &&0 &&0 &&0 \\
\end{array}\right]$
### 單位方陣
可記為 $I_n$ ,必為方陣且所有主對角線數字為 $1$ 其餘為 $0$
:::warning
任何矩陣乘以單位方陣皆不會改變原來的值
:::
$e.g.\ I_{2} = \left[
\begin{array}{cc}
1 &&0 \\
0 &&1 \\
\end{array}\right]$
$e.g.\ I_{3} = \left[
\begin{array}{ccc}
1 &&0 &&0 \\
0 &&1 &&0 \\
0 &&0 &&1 \\
\end{array}\right]$
### 矩陣加法、減法
同階矩陣才可相加減,運算時,相對應位置數字進行運算
$e.g.\ A = \left[
\begin{array}{ccc}
1 &&0 &&3 \\
5 &&6 &&0 \\
10 &&0 &&1 \\
\end{array}\right],
B = \left[
\begin{array}{ccc}
1 &&6 &&4 \\
0 &&1 &&-1 \\
7 &&2 &&1 \\
\end{array}\right]$
$A + B = \left[
\begin{array}{ccc}
1+1 &&0+6 &&3+4 \\
5+0 &&6+1 &&0-1 \\
10+7 &&0+2 &&1+1 \\
\end{array}\right]
=\left[
\begin{array}{ccc}
2 &&6 &&7 \\
5 &&7 &&-1 \\
17 &&2 &&2 \\
\end{array}\right]$
### 係數積
若將一個矩陣乘以k倍,則將該矩陣內每一個元素都乘以k倍
$e.g.\ A = \left[
\begin{array}{ccc}
a_{11} &&a_{12} &&a_{13} \\
a_{21} &&a_{22} &&a_{23} \\
a_{31} &&a_{32} &&a_{33} \\
\end{array}\right]$
$A * k = \left[
\begin{array}{ccc}
a_{11}*k &&a_{12}*k &&a_{13}*k \\
a_{21}*k &&a_{22}*k &&a_{23}*k \\
a_{31}*k &&a_{32}*k &&a_{33}*k \\
\end{array}\right]$
### 轉置矩陣
若將一個矩陣轉置,則將該矩陣內的所有行列互換
$e.g.\ A = \left[
\begin{array}{ccc}
1 &&0 &&3 \\
5 &&6 &&0 \\
\end{array}\right]$
$\ A^T = \left[
\begin{array}{cc}
1 &&5 \\
0 &&6 \\
3 &&0 \\
\end{array}\right]$
### 矩陣乘法
必須 **前一個矩陣的行數** 和 **後一個矩陣的列數** 相同才可進行乘法
>$A_{x*y} * B_{y*z} = C_{x*z}$
$e.g.\ A = \left[
\begin{array}{ccc}
a_{11} &&a_{12} &&a_{13} \\
a_{21} &&a_{22} &&a_{23} \\
\end{array}\right],
B = \left[
\begin{array}{cc}
b_{11} &&b_{12} \\
b_{21} &&b_{22} \\
b_{31} &&b_{32} \\
\end{array}\right]$
$A * B = \left[
\begin{array}{ccc}
a_{11}*b_{11}+a_{12}*b_{21}+a_{13}*b_{31} &&a_{11}*b_{12}+a_{12}*b_{22}+a_{13}*b_{32}\\
a_{21}*b_{11}+a_{22}*b_{21}+a_{23}*b_{31} &&a_{21}*b_{12}+a_{22}*b_{22}+a_{23}*b_{32} \\
\end{array}\right]$
### 反矩陣
A的反矩陣可記為 $A^{-1}$ ,2者相乘為 $1$
假設 $A = \left[
\begin{array}{cc}
a &&b \\
c &&d \\
\end{array}\right],det(A) = \begin{vmatrix}
a & b \\
c & d
\end{vmatrix}$
則$A^{-1} =
\cfrac{1}{det(A)} *\left[
\begin{array}{cc}
d &&-b \\
-c &&a \\
\end{array}\right]$
### 解方程式
$3x + 2y = 7$
$4x - 3y = -2$
A為係數矩陣、B為常數矩陣、X為未知數
$A = \left[
\begin{array}{cc}
3 &&2 \\
4 &&-3 \\
\end{array}\right],
B = \left[
\begin{array}{c}
7\\
-2\\
\end{array}\right],
X = \left[
\begin{array}{c}
x\\
y\\
\end{array}\right]$
原式
$A*X = B$
$\Rightarrow A*A^{-1}*X = B*A^{-1}$
$\Rightarrow X = B*A^{-1}$
## Numpy
[**Numpy 官網**](https://numpy.org/)
### 為什麼需要 Numpy
Numpy 的架構中,有`ndarray`可以使用,在用法上跟`List`很像,但方便性、執行速度都比`List`快上許多
>ndarray 全名為 n-dimensional array 是一種多為陣列,為 Numpy 獨有的資料型態
### 建立 array
```python=
import numpy as np
```
- 利用`List`、`Tuple`轉換成`array`
```python=
A = np.array([1, 2, 3, 4, 5])
B = np.array((1, 2, 3, 4, 5))
```
:::warning
**ndarray**
其中的`nd`代表這個陣列的維度,可以使用`arr.ndim`來回傳該資料的維度
>其中不能有數字和列表同地位的狀況
ex. 0d
```python=
A = np.array(42)
print(A, type(A), A.ndim)
```
ex. 1d
```python=
A = np.array([42])
print(A, type(A), A.ndim)
```
ex. 2d
```python=
A = np.array([[1, 2, 3], [4, 5, 6]])
print(A, type(A), A.ndim)
```
ex. 3d
```python=
A = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])
print(A, type(A), A.ndim)
```
- `.size`回傳所有元素數量
- `.shape`以`Tuple`的形式返回每個axis的長度
```python=
A = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])
print(A.size)
print(A.shape)
```
:::
- 建立初始化矩陣,利用`Tuple`來包裝想要的矩陣大小
- 利用`np.ones()`來創造全為 $1$ 的矩陣
- 利用`np.zeros()`來創造全為 $0$ 的矩陣
>記得有2個`()`
```python=
A = np.ones((2, 3))
B = np.zeros((1, 4))
print(A)
print(B)
```
- 建立單位矩陣
利用`.eye(n)`,來建立$n*n$的單位矩陣
```python=
A = np.eye(4)
print(A)
```
### indexing
- 有2種方式,1種和之前一樣,另1種和之前的`List`,有些許不同,利用`[]`依序輸入各維度index,並用`,`隔開
```
[[1, 2, 3],
[4, 5, 6]]
```
以取出第一列第二個數字來示範,
**List**
```python=
A = [[1, 2, 3], [4, 5, 6]]
print(A[0][1])
```
**Array**
```python=
nd_A = np.array(A)
print(nd_A[0, 1])
print(nd_A[0][1])
```
### slicing
- 和之前的`List`相同,利用`[]`依序輸入開頭及結尾的index並用`:`隔開
```
[start:end:step]
```
>end一樣不包含
```python=
A = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
print(A[0, 1:3])
```
### 加減法
- 相同大小的2矩陣可利用`+`、`-`來進行各位置的加減法
```python=
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[8, 9, 1], [-1, 6, 10]])
print(A+B)
print(A-B)
```