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) = 0
행렬의 기본행 연산과 행렬식 관계
- 기본행 연산1. 한행에 0이 아닌 상수를 모두 곱한다
- k*det(A) = det(B)
- B는 A의 한 행에 k를 곱한 기본행 연산1을 한 결과
- det(kA) = k**n * det(A)
- A의 모든 원소에 k배한 경우, k의 n승을 곱한 결과와 같음
- k*det(A) = det(B)
- 기본행 연산2. 두 행을 교환한다
- -det(A) = det(B)
- A의 두 행을 교환한 결과인 행렬 B의 행렬식은 A의 행렬식 부호를 바꾼 것과 동일
- -det(A) = det(B)
- 기본행 연산3. 한행의 배수를 다른 행에 더한다
- det(A) = det(B)
- A의 한 행에 한행의 배수를 더한 행렬 B의 행렬식은 같음
- det(A) = det(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
이 외에 주어진 행렬을 삼각행렬로 변환한 다음에 주 대각원소를 곱해서 행렬식을 구하는 방법도 있음 (하지만 귀찮아서 패스)
'👩💻LEARN : ML&Data > Book Study' 카테고리의 다른 글
[알고리즘 구현으로 배우는 선형대수] #7. 기저와 차원 (0) | 2023.04.10 |
---|---|
[알고리즘 구현으로 배우는 선형대수] #6. 역행렬 (0) | 2023.04.10 |
[딥러닝 파이토치 교과서] #1. 파이토치 기초 (0) | 2023.04.09 |
[알고리즘 구현으로 배우는 선형대수] #4. 선형 시스템 (0) | 2023.04.08 |
[알고리즘 구현으로 배우는 선형대수] #3. 다양한 행렬 (0) | 2023.04.07 |