# 행렬 정의하기

파이썬에서 행렬을 사용하는 방법은 여러가지가 있다. 우선은 numpy을 이용하여 작성하는 방법을 소개하고, sympy을 이용하는 방법을 소개한다.


```python
import numpy as np
```

그리고 이제 행렬을 다음과 같이 정의한다.


```python
test_a = np.array([[3,1,4],[2,-1,3]])
test_b = np.array([[2,1,-1],[1,-2,4]])
```

만들어진 행렬은 2x3 행렬이라는 것을 다음 명령어로 확인할 수 있다.


```python
print('a-type: {}, b-type: {}'.format(test_a.shape, test_b.shape))
```

    a-type: (2, 3), b-type: (2, 3)


# 행렬의 연산

행렬의 연산에는 덧셈, 스칼라배, 곱셈이 있다. 그 외에도 성분끼리 곱하기 텐서곱 등이 있다.
이 교안은 알기쉬운 선형대수학 책을 바탕으로 짰다. 

다음은 p.12의 예제 3이다. 


```python
test_a + test_b
```




    array([[ 5,  2,  3],
           [ 3, -3,  7]])




```python
2*test_a
```




    array([[ 6,  2,  8],
           [ 4, -2,  6]])



영행렬을 만들어주려면 다음과 같은 명령어를 사용한다.


```python
zero=np.zeros((2,3))
zero.shape
```




    (2, 3)



p.14에 있는 예제4(결합법칙의 확인)를 파이썬으로 확인해보자.


```python
a = np.array([[1,-2,4],[0,3,-1]])
b = np.array([[3,2,-2],[-2,1,5]])
c = np.array([[6,4,9],[-1,2,1]])

d = (a+b)+c
e = a+(b+c)

d == e
```




    array([[ True,  True,  True],
           [ True,  True,  True]])



이제 행렬의 곱셈을 정의하면 다음과 같은 명령어를 사용하면 된다. p.16 예제 5를 해보자.


```python
a = np.array([[2,1,-1],[-1,4,1]])
b = np.array([[2,1],[0,3],[-1,1]])

#np.matmul(a,b)

print('AB=\n{}\n\nBA=\n{}'.format(np.matmul(a,b),np.matmul(b,a)))
```

    AB=
    [[ 5  4]
     [-3 12]]
    
    BA=
    [[ 3  6 -1]
     [-3 12  3]
     [-3  3  2]]


행렬의 곱셈에 관한 결합법칙이 성립함을 파이썬 계산으로 확인해보자.


```python
a = np.array([[2,-1,4],[3,5,1]])
b = np.array([[-5,0,-6],[1,-2,1],[0,7,4]])
c = np.array([[2,1],[0,3],[-1,1]])

np.matmul(np.matmul(a,b),c) == np.matmul(a,np.matmul(b,c))
```




    array([[ True,  True],
           [ True,  True]])



## 역행렬 구하기

역행렬을 구하는 것부터는 별도의 라이브러리를 불러야 한다.
p.43의 예제 18을 생각해보자


```python
import numpy.linalg as linalg

a = np.array([[2,1],[3,4]])
b = np.array([[1,1,2],[0,1,3],[1,-1,0]])
print('inverse of A:\n{},\n\ninverse of B:\n{}'.format(linalg.inv(a),linalg.inv(b)))
```

    inverse of A:
    [[ 0.8 -0.2]
     [-0.6  0.4]],
    
    inverse of B:
    [[ 0.75 -0.5   0.25]
     [ 0.75 -0.5  -0.75]
     [-0.25  0.5   0.25]]


숫자를 분수형으로 쓰고 싶다면 다음과 같은 라이브러리를 부른다.


```python
from sympy import MatrixSymbol, Matrix

c=Matrix(a)
d=Matrix(b)

#print(d**-1)
#print('inverse of A:\n{},\n\ninverse of B:\n{}'.format(c**-1,d**-1))
```


```python
c**-1
```




$\displaystyle \left[\begin{matrix}\frac{4}{5} & - \frac{1}{5}\\- \frac{3}{5} & \frac{2}{5}\end{matrix}\right]$




```python
d**-1
```




$\displaystyle \left[\begin{matrix}\frac{3}{4} & - \frac{1}{2} & \frac{1}{4}\\\frac{3}{4} & - \frac{1}{2} & - \frac{3}{4}\\- \frac{1}{4} & \frac{1}{2} & \frac{1}{4}\end{matrix}\right]$



참고로 sympy을 이용해서 앞절에서 했던 계산을 적용해보면 다음과 같다.


```python
a = sympy.Matrix([[2,-1,4],[3,5,1]])
b = sympy.Matrix([[-5,0,-6],[1,-2,1],[0,7,4]])
c = sympy.Matrix([[2,1],[0,3],[-1,1]])

(a * b) * c 
```




    True




```python
(a * b) * c == a * (b * c)
```




    True



## 연립일차방정식의 해

파이썬을 이용해서 연립일차방정식의 해를 구해보자.
p.34의 예제 16번이다.


```python
a = np.array([[1,-3,2,5],[2,3,-4,10],[-6,0,-8,0],[0,6,-8,-5]])
b = np.array([[1],[3],[-5],[-1]])

#a.shape
#b.shape

linalg.solve(a,b)
```




    array([[0.5       ],
           [0.33333333],
           [0.25      ],
           [0.2       ]])



답을 분수형으로 구하고 싶으면 아래의 라이브러리를 부른다.


```python
from sympy.solvers.solveset import linsolve

linsolve((Matrix(a),Matrix(b)))
```




$\displaystyle \left\{\left( \frac{1}{2}, \  \frac{1}{3}, \  \frac{1}{4}, \  \frac{1}{5}\right)\right\}$



## 기약행사다리꼴 만들기 

이제 주어진 행렬의 기약행사다리꼴을 만들어보자.
이를 위해서는 별도의 라이브러리로 sympy를 불러야한다.

같은 예제 16번을 생각해보자.


```python
import sympy

a = np.array([[1,-3,2,5,1],[2,3,-4,10,3],[-6,0,-8,0,-5],[0,6,-8,-5,-1]])

sympy.Matrix(a).rref()
```




    (Matrix([
     [1, 0, 0, 0, 1/2],
     [0, 1, 0, 0, 1/3],
     [0, 0, 1, 0, 1/4],
     [0, 0, 0, 1, 1/5]]),
     (0, 1, 2, 3))



## 행렬식 구하기


```python
M = sympy.Matrix([[1, 0, 1], [2, -1, 3], [4, 3, 2]])
M.det()
```




$\displaystyle -1$



754671fb58aaffea67864303966a721130530691
ipynb
Jupyter Notebook
assets/files/Matrix.ipynb
willkwon-math/willkwon-math.github.io
aace3fc5ebadba00616699e9b2299770cf823d33
0BSD
assets/files/Matrix.ipynb
willkwon-math/willkwon-math.github.io
aace3fc5ebadba00616699e9b2299770cf823d33
0BSD
assets/files/Matrix.ipynb
willkwon-math/willkwon-math.github.io
aace3fc5ebadba00616699e9b2299770cf823d33
0BSD
Qwen/Qwen-72B
1. YES
2. YES