👩‍💻LEARN : ML&Data/Book Study

[알고리즘 구현으로 배우는 선형대수] #2. 행렬

쟈니유 2023. 3. 17. 15:26
728x90

넘파이로만 쉽게 산 내게 닥쳐온 고난...

 

numpy로 간단하게...array 선언해서 행렬연산하던 내게..

파이썬으로 하나하나 구현해보게 하는... 참 가르침을...주시는 단원...💡

 


#2. 행렬

(이라 쓰고 행렬 연산에 대한 걸 파이썬으로 구현해보기라고 읽는다)

 

 

2.1 스칼라

  • 크기 만으로 나타낼 수 있는 물리량. 쉽게 말해 ‘숫자 하나’ 로 표현되는 것
 

2.2 벡터

  • 크기와 방향을 모두 나타내는 개념으로, 스칼라의 집합이며 행렬을 구성하는 기본 단위
  • 크기와 방향이 같다면 그래프 상 위치와 상관 없이 동일한 벡터로 간주
 
파이썬 버전으로
#벡터 덧셈 함수로 만들기 

def v_add(u,v):
    n=len(u)
    w=[]
    
    for i in range(0,n):
        val = u[i]+v[i]
        w.append(val)
    return w 

v_add(u,v)

#벡터 * 스칼라 곱 함수로 만들기 

def scalar_v_mul(u,a):
    n = len(u)
    w = []
    
    for i in range (0,n):
        val = u[i] * a
        w.append(val)
        
    return w

test_u = [3,4,5]
test_a = 2
scalar_v_mul(test_u,test_a)

# 벡터 간 원소곱 

u = [1,2,4]
v = [7,3,2]

def v_mul(u,v):
    n=len(u)
    w = []
    
    for i in range (0,n):
        val = u[i] * v[i]
        w.append(val)
    return w 

v_mul(u,v)

넘파이 구현

import numpy as np

u = np.array([1,2,3])
v = np.array([4,5,6])

#덧셈
w = u+v
print(w)

#스칼라곱 
a = 3 
mul_u = a * u 
print(mul_u)

#벡터곱 
mul_uv = u*v 

print(mul_uv)
 

2.3 행렬

  • 행과 열로 구성
  • 행렬 원소 : 하나의 스칼라 행과 열 번호에 따라 기재 가능
 

2.3.1 행렬 곱

  • 행렬끼리 곱하는 것으로 곱하는 행렬의 열과 곱해지는 행렬의 행의 크기가 일치해야 가능
  • 행렬 곱의 결과 요소인 행렬 원소는 아래와 같음
 
파이썬 버전 구현
#행렬 곱 

A = [[2,7], [3,4], [5,2]]
B = [[3,-3,5], [-1,2,-1]]

n = len(A)                               #A의 행
p1 = len(A[0])                           #A의 렬
p2 = len(B[0])                           #B의 렬 (행은 A의 렬과 동일) 

res=[]
for i in range(0,n):
    row=[]
    for j in range(0,p2):
        val = 0
        for k in range(0,p1):
            val += A[i][k] * B[k][j]     #i=n, k=p1, j=p2 
        row.append(val)
    res.append(row)
    
#위의 구현을 함수로 만들기 

def matmul (A,B):
    n = len(A)
    p1 = len(A[0])
    p2 = len(B[0])
    
    res = []
    for i in range(0,n):
        row = []
        for j in range (0,p2):
            val = 0
            for k in range (0,p1):
                val += A[i][k] * B[k][j]
            row.append(val)
        res.append(row)
    return res 


matmul (A,B)
 
넘파이 버전 구현
import numpy as np

A = np.array([[1,2],[3,4],[5,6]])  #np.array로 행렬 선언해줘야 사용 가능 
B = np.array([[2,3,4],[2,4,5]])


#행렬곱 

D = np.matmul(A,B)

print(C,D)