---
# System prepended metadata

title: 資研 4/19 社課講義
tags: [社課講義, 資研]

---

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