# 資研 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) ```