👩‍💻LEARN : ML&Data/Book Study

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

쟈니유 2023. 4. 10. 16:28
728x90

 

행렬식과 역행렬을 보며 코웃음 치던 저는 몰랐죠...

기저와 차원을 배우며 아찔해질 줄은.... 

 


#5. 행렬식 

 

행렬식의 개념

  • 행렬의 특성을 하나의 숫자로 표현하는 방법으로, 정사각 행렬을 스칼라로 변환하는 함수 
    • 행렬식을 통해 역행렬 구할 수 있음
    • 해당 행렬의 특성을 알 수 있음. 3차원일 경우, 행렬의 벡터로 구성되는 육면체의 부피를 구하는 것 

행렬식 계산법

2차원 행렬의 경우

  • det(A) = |A| = a11a22 - a12a21 
    • 주 대각행렬 원소를 곱한 값에 나머지 원소를 곱한 값을 빼는 것 

 

3차원 이상 행렬의 경우 

  • 소행렬 : 원소 aij에 대한 소행렬은 i행과 j열 을 제외한 나머지 행렬로 구성된 행렬 
  • 소행렬식(Mij) : aij에 대한 소행렬식은 행렬 i행 j열을 제외하고 구성된 부분행렬의 행렬식 
  • 여인수(Cij) : (-1)**(i+j) * Mij(소행렬의 ij원소)로 소행렬식과 부호의 차이만 있음 
  • 일반적인 n*n행렬의 행렬식
    • det(A) = a11*C11 + a12*C12+...+a1n*C1n 

 

행렬식 성질 

삼각행렬의 행렬식

det(A) = a11*a22*a33 

대각행렬의 행렬식

det(A) = a11*a22*a33

이를 응용하면 단위행렬의 행렬식 = 1 

전치행렬의 행렬식

det(A) = det(At) 

특정 행,열의 원소가 모두 0일때의 행렬식 

det(A) =

행렬의 기본행 연산과 행렬식 관계

  • 기본행 연산1. 한행에 0이 아닌 상수를 모두 곱한다
    • k*det(A) = det(B) 
      • B는 A의 한 행에 k를 곱한 기본행 연산1을 한 결과 
    • det(kA) = k**n * det(A) 
      • A의 모든 원소에 k배한 경우, k의 n승을 곱한 결과와 같음 
  • 기본행 연산2. 두 행을 교환한다
    • -det(A) = det(B)
      • A의 두 행을 교환한 결과인 행렬 B의 행렬식은 A의 행렬식 부호를 바꾼 것과 동일 
  • 기본행 연산3. 한행의 배수를 다른 행에 더한다 
    • det(A) = det(B)
      • A의 한 행에 한행의 배수를 더한 행렬 B의 행렬식은 같음 

비례하는 행열에 대한 행렬식

  • 행렬 A에서 1행이 2행의 n배수라면 det(A) = 0

행렬곱과 행렬식 

  • det(AB) = det(A) * det(B) 

 

파이썬 실습

#1. 넘파이 구현 

import numpy as np

A = np.array([[3,2,0],[-1,-3,6], [2,3,-5]])
detA = np.linalg.det(A)
print(detA)

#2. 재귀 함수로 구현 

def det_rec(A):

  n = len(A)
  res = 0

  #2*2
  if n==2:
    res = A[0][0]*A[1][1]-A[0][1]*A[1][0]
    return res 

  #n*n
  for i in range(0,n):
    X = deepcopy(A)
    X = X[1:]     #0행 제외 나머지 행렬 
    nx = len(X)

    for j in range(0,nx):           #소행렬 구하기 
      X[j] = X[j][0:i] + X[j][i+1:] 

    sign = (-1)** (i%2)              #i+j이긴한데, 원래 지그재그형식이라 1이면1, 2배수면0 
    sub_det = det_rec(X)             #구한 소행렬식을 재귀로 다시 넣어줌 
    res += sign*A[0][i]*sub_det 

  return res

 

이 외에 주어진 행렬을 삼각행렬로 변환한 다음에 주 대각원소를 곱해서 행렬식을 구하는 방법도 있음 (하지만 귀찮아서 패스)