숫자의 인수분해는 주어진 숫자를 여러 숫자의 곱으로 분해하여 표현하는 것이다.
행렬의 경우에서도 주어진 행렬을 행렬분해 한 생태로 가지고 있으면 계산이 편해지는 경우가 많다.
대표적인 행렬분해는 다음과 같다.
LU 분해는 주어진 행렬을 두 행렬의 곱으로 나누는 행렬분해이다.
L : lower triangular matrix(하삼각행렬)
U : upper triangular matrix(상삼각행렬)
주어진 행렬 A가 LU 분해되어 있다면
Ax = b -> (LU)x = b -> Ly = b,(Ux = y)으로 식을 변형해서
하나의 행렬의 문제를 두개의 행렬의 문제로 나눌 수가 있다.
LU분해는 가우스 소거법의 전방소거법forward elimination을 행렬로 코드화 한 것이다.
LU분해는 다음과 같은 이유로 활용된다.
행렬matrix은 직사각형 구조에 숫자들을 담아 놓는 구조이다. 각 숫자들은 행렬의 요소entry라 부른다. m x n 행렬은 m개의 행과 n개의 열로 이루어진 행렬이다.
하나의 행 혹은 하나의 열을 가지는 행렬은 각각 행벡터, 열벡터라 한다.
1x1행렬은 스칼라와 같다.
행렬 A의 각 (i, j) 요소는 aij로 나타낸다.
행렬 A를 간략히 표기할 때는 A=[aij]로 나타낸다.
행렬 A의 크기가 중요할 경우는 A=[aij]mxn으로 나타낸다.
m x n 행렬 A에 대한 전치행렬 A^T는 A의 행을 열로, A의 열을 행으로 가지는 n x m 행렬이다. 즉, (A^T)ij = (A)ji를 만족한다.
벡터는 볼드체 소문자로 표기한다.
벡터라고 하면 일반적으로 열벡터(column vector)를 말한다.
n벡터는 n개의 스칼라(scalar)로 구성된 벡터를 말한다.
행렬의 모든 요소가 0이면, 해당 행렬을 영행렬이라 하고 O으로 표기한다.
A + O = O + A = A
영행렬은 숫자의 0과 같은 존재로 행렬합에 대한 항등원 역할을 한다.
행렬의 합 : 두 행렬 A와 B는 행과 열의 개수가 모두 같을 때 성립하며, 각 (i,j)요소의 합으로 정의 된다.
행과 열의 개수가 모두 n인 정사각형 모양의 행렬을 n차 정방행렬이라 한다.
특히 aii(i=1,2,...,n)를 행렬 An의 주대각선main diagonal이라 한다.
주대각선이 1이고 나머지 요소는 모두 0인 n차 정방행렬을 항등행렬이라 한다.
항등행렬은 숫자의 1과 같은 존재로 행렬곱에 대한 항등원 역할을 한다.
m x r 행렬 A=[aij]와 r x n 행렬 B=[bij]가 있을 때, 두 행렬의 곱 AB는 m x n 행렬 C=[cij]를 정의한다. 여기서 두 행렬의 곱 AB로 정의 된 행렬 C의 각 (i,j)요소는 다음과 같이 정의 된다.
cij = ai1b1j + ai2b2j + ... + airbrj
스칼라는 숫자 하나로 구성되어 있다.
스칼라 7 -> 벡터 [7] -> 행렬 [7]1x1
4 vector -> 4x1 matrix
2x3 matix -> 6 vector
텐서는 스칼라, 벡터, 행렬을 아우르는 개념이다. 숫자가 늘어설 수 있는 방향이 k개면 k-텐서로 부른다.
0텐서 : 스칼라, 1텐서 : 벡터, 2텐서 : 행렬
만일 행렬 T의 각 요소 Pij가 벡터라면, T는 3텐서로 볼 수 있다.
3텐서의 대표적인 예는 컬러영상이다. Pij가 3벡터이면 RGB영상을, 4벡터이면 RGBA 영상을 나타낸다고 볼 수 있다.
T = 4 x 4 pixel resolution with 3 vector
추상적인 구조로 행렬/행렬연산을 파악하는 방법
행렬을 조각partition 단위로 분할하여 생각해도 무방하다. 이런 관점에서 본다면, 행렬은 부분행렬submatrix로 이루어진 직사각형 구조로 확장해서 생각할 수 있다. 이렇게 행렬을 구조적으로 보는 방법을 분할행렬partitioned matrix 또는 블록행렬block matrix라 한다.
두 행렬의 곱 AB = C를 아래와 같이 matrix-column vector products로 볼 수 있다.
AB = A[b1 b2 ... bn] = [Ab1 Ab2 ... Abn] = C
두 행렬의 곱 AB = C를 아래와 같이 row vector-matrix products로도 볼 수 있다.
AB = [[a1],[a2]...[am]]B = [[a1B],[a2B]...[amB]] = C
A를 열벡터의 집합으로 보고 어떤 방식으로 가중치 합을 하느냐에 따라 b를 만들어 낼 수 있느냐를 알 수 있다.
행렬을 구조적으로 바라보는 가장 효과적인 방법은 다음과 같다.
A = [a1 a2 ... an]
여기서 ai는 행렬 A의 i번째 열벡터이다. 특히 각 열벡터는 m벡터이기 때문에, m x n 행렬은 m벡터가 n개 있다고 해석하면 된다.
이제 Ax를 다음과 같이 구조적으로 볼 수 있다.
Ax는 행렬 A가 가지고 있는 열벡터의 선형조합이다.
Ax = [a1 a2 ... an][x1][x2] ... [xn]] = x1a1 + x2a2 + ... + xnan
첫번째 열벡터를 x1배 가중치 ...
선형대수에서는 이처럼 벡터들에 대한 가중치 합을 특히 선형조합linear combination이라 부른다. 좌항은 아무리 복잡해도 A가 가진 열벡터의 가중치 조합을 벗어날 수 없다.
행렬 A의 열벡터들에 대한 가능한 모든 선형조합의 결과를 모아 집합으로 구성할 수 있을 것이다. 이들의 집합을 column space라 하고 다음과 같이 표기한다. col(A)
Consistent Linear System
선형 시스템 Ax = b가 해를 가지면, 다음을 만족한다. b in col(A)
Inconsisten Lenear System
선형 시스템 Ax = b가 해를 가지지 않으면, 다음을 만족한다. b not in col(A)
즉 A의 열벡터에 가중치를 곱해서 만든 선형조합인 열공간으로 벡터b를 만들어 낼수 없다면(가령 열공간이 xy평면에서만 존재하는 경우) z값을 가지는 벡터b는 만들어 낼수가 없다.
좌표계 변환(Change of Basis):
좌표계 :: 좌표값 = 행렬 :: 벡터
선형시스템을 보는 새로운 관점
벡터는 크기와 방향을 가진 물리량으로 다음과 같이 표현될 수 있다.
벡터의 물리적 표현(좌표계가 없는)
벡터 v를 화살표로 표현한다.
v의 크기 : 화살표의 길이
v의 방향 : 화살표의 방향
벡터의 수학적 표현(좌표계가 있는)
벡터 v를 화살표로 표현한다.
좌표계를 도입한후, 벡터의 시작점을 원점에 맞추고 끝점의 위치를 벡터 v의 수학적 표현으로 정의한다.
v의 크기 : 화살표의 길이를 계산
v의 방향 : 화살표의 방향을 벡터로 표현
다음과 같이 2벡터 v가 주어졌다고 하자. 이 벡터는 xy평면 상에서는 원점 (0,0)에서 시작하여 (a,b)에서 끝나는 벡터를 의미한다. v는 다음과 같이 해석될 수 있다.
v = [[a][b]] = x[[a][b]] = a[[1][0]] + b[[0][1]]
수식의 각 요소는 다음과 같다.
a[[1][0]] = x축으로 내린 수선의 발
b[[0][1]] = y축으로 내린 수선의 발
x = xy좌표계
좌표값은 좌표계를 수반해야한다.
만약 두 벡터 v1과 v2를 이용해 새롭게 좌표계를 만든다면 v의 좌표값은 무엇일까? 새로운 좌표계를 만든다는 말은 어떤 벡터 v에 도착하기까지의 과정을 오롯이 v1과 v2를 몇번 사용하여 도착했는지로 표현한다는 의미이다.
즉, v1과 v2를 이용해 만든 새로운 좌표계에서 v의 좌표값은 (4,3)이라 해야한다. 왜냐하면 4v1 + 3v2 = v이기 때문이다.
우항 : e1([[1][0]])과 e2([[0][1]])를 기저basis로 가지는 표준좌표계standard coordinate system에서 벡터 v의 좌표값은 (a,b)이다.
좌항 : v1과 v2를 기저basis로 가지는 좌표계coordinate system에서는 동일한 벡터v의 좌표값은 (4,3)이다.
선형시스템 문제를 좌표계 변환으로 바라보는 새로운 시선을 배웠다.
A는 v1과 v2의 열벡터로 이루어진 행렬이다.
x는 v1과 v2가 몇번을 사용해야 하는 지를 알려주는 좌표값이다.
b는 좌표값인데 표준 좌표계가 숨어 있는 x의 또다른 좌표값이다.
따라서 x와 b는 서로 다른 좌표계를 사용해서 동일한 좌표를 표현하는 2가지 방식이다.
역행렬을 이용해 선형시스템의 해를 구하는 문제 역시 좌표계변환으로 바라볼 수 있다.
행렬은 좌표계이고, 벡터는 좌표값이다.
임의의 v는 다양한 좌표계에서 표현될 수 있다.
표준좌표계에서 표현된 (I)v = A [V]a(좌표계A에서 표현된 v) = B [V]b(좌표계B에서 표현된 v)
행렬은 선형 함수다
함수는 두 집합 간의 맵핑룰mapping rule이다.
입력이 정의되는 집합을 정의역domain이라 한다. 출력이 정의 되는 집합을 공역codomain이라 하며, 공역 중 실제 함수의 출력이 나오는 부분 집합을 치역range이라고 한다. 함수 f는 정의역의 각 원소 x가 공역의 한원소 y에 대응되는 매핑룰이다.
f(x) = x^2 + 2x + 3
float f(floatx) {return xx + 2x + 3;}
만일 함수 f가 아래 두가지 조건을 만족하면 함수 f를 선형함수이라고 한다.
f(x + y) = f(x) + f(y),
f(cx) = cf(x) (단, c는 임의의 스칼라)
위 식은 언뜻 보면 당연하게 보이지만, 실은 함수 f에 대해 전혀 당연하지 않은 성질을 설명하고 있다.
함수의 입력이 n벡터이고 출력이 m벡터인 함수 T가 있다면 이와 같이 함수의 입출력이 벡터인 함수를 변환transformation이라고 한다.
특별히 n = m인 경우, 해당 변환을 연산자operator라고 한다.
m x n행렬 A에 대해 Ax는 n벡터를 입력으로 받아 m벡터를 출력으로 내는 변환 T(x) = Ax으로 볼 수 있다. 이 변환은 행렬이 정의하기 때문에 행렬변환이라고 한다. Ta : R^n -> R^m
그런데 행렬변환은 다음의 선형함수 성질을 모두 만족하기 때문에 선형변환이다.
A(x + y) = A(x) + A(y),
A(cx) = cA(x) (단, x, y in R^n이고, c는 임의의 스칼라)
행렬변환이 입출력이 벡터로 정의된 선형함수라면, 해당함수를 어떻게 코딩할 수 있을까?
1. 구현하고자 하는 기능의 입력과 출력이 벡터로 정의되는지 확인한다.
2. 구현하고자 하는 기능이 선형인지 확인한다.(function을 그리면 선형으로 나오는지)
3. 입력이 n벡터이고, 출력이 m벡터이면 m x n 표준행렬을 구성한다.
A = [T(e1) T(e2) ... T(en)]
n차원 표준기저벡터 {e1, e2, ..., en}를 생각한다.
각 n차원 표준기저벡터 ei에 대해, 우리가 원하는 기능을 동작시켜 얻은 결과인 m차원 벡터 T(ei)를 표준행렬의 각 열에 적는다.
2차원 벡터를 입력으로 받아, 해당 벡터를 x축에 프로젝션하는 기능을 구현해보자
(3, 2) -> (3, 0)
e1 = [[1][0]], e2 = [[0][1]]
T(e1) = [[1][0]], T(e2) = [[0][0]]
2차원 벡터를 입력으로 받아, 해당 벡터를 반시계 방향으로 x 회전하는 기능을 구현해보자
우선 벡터를 입출력으로 쓰기 때문에 변환이다.
직선을 넣었을 때 출력이 마찬가지로 직선으로 나오기 때문에 선형이다.
e1 = [[1][0]], e2 = [[0][1]]
T(e1) = [[cosx][sinx]], T(e2) = [[cos(x+90)][sin(x+90)]]