행렬(수학)
1. 개요
'''행렬(Matrix, 行列)'''은 1개 이상의 수나 식을 사각형의 배열로 나열한 것을 말한다. 이때, 가로줄을 행[2] (Row), 세로줄을 열(Column)[3] 이라고 부른다.
2. 상세
행렬은 아서 케일리와 윌리엄 로원 해밀턴이 발명했으며, 역사적으로 본다면 행렬은 '연립일차방정식의 풀이를 어떻게 하면 될까?'라고 고민한 데서 시작했다. 아서 케일리가 연구하던 중에 행렬식의 값에 따라 연립방정식의 해가 다르게 나오는 것을 보고 이것이 해의 존재 여부, 즉 행렬의 가역 여부(Invertibility)를 판별한다는 관점에서 Determinant라고 부른 데서 행렬식이 탄생했고, 윌리엄 로원 해밀턴이 '야, 그러면 연립 방정식의 계수랑 변수를 따로 떼어내서 쓰면 어떨까?[4] '라는 생각에서 행렬이 탄생했다. 즉, 역사적으로 보면 행렬식이 행렬보다 먼저 탄생했다.
사실 그 존재가치는 함수 내지는 사상(Map, 寫像)을 표현하기 위한 도구라는 데 있다. 모든 선형 변환은 행렬로 표현할 수 있고 그 역도 성립한다. 즉, '''행렬은 선형 변환과 같다.''' 이를 '''선형대수학의 기본정리'''라고[5] 한다. 행렬의 곱셈을 덧셈이나 뺄셈처럼 안 하고 복잡하게 정의해 놓은 이유도 여기 있다. 참고로 정확히 말하면 차원이 $$n$$인 $$F$$-벡터공간에서 차원이 $$m$$인 $$F$$-벡터공간으로 가는 선형변환의 집합과 $$F$$ 위의 $$n\times m$$ 행렬의 집합이 $$F$$-대수(Algebra)로서 동형(Isomorphic)인 것인데, 선형대수학 수준에서는 증명은 다 하면서도 어물쩡 넘긴다.
독립변수 1개, 종속변수 1개인 일반적인 일변수함수는 행렬 개념을 쓰지 않고도 수로 직관적으로 설명할 수 있지만, 정의역이나 공역의 차원이 둘 이상이 되기 시작하면 그때부터는 수가 아니라 행렬로 함수를 표현해야 한다.[6] 예컨대 정의역이 2차원이고 공역이 3차원인 함수(대응)를 표현하는 행렬은 $$3 \times 2$$ 행렬이다. 중·고급 수학의 핵심 개념.
보통 이과 학생들은 대학에서 선형대수학을 배우면서 미지수가 2개 이상인 방정식이나, 둘 이상의 변수로 정의되는 함수를 표현하려면 행렬이 필수적이다. 이공계에서 선형대수학은 정말 활용도가 높은 과목이기에 몇몇 특수한 학과[7] 가 아닌 이상 전부 이를 배우게 된다. 왜냐하면 실제 세계를 수식으로 모델링 할 때는 필연적으로 여러 개의 방정식을 동시에 만족시키는 해 또는 근사를 구해야 하고, 이를 위한 방법론 중 가장 대표격이 선형대수학이기 때문이다. 물론 수학과 학생들은 이런 '행렬 활용법'에 가까운 공대 선형대수 이상의 원론적인 개념으로 행렬에 대해 접근하게 된다.
아래와 같이 하나의 열로 구성되면 '''열벡터''', 하나의 행으로만 구성되면 '''행벡터'''라고 한다. 보통 책에는 조판이 귀찮아서 열벡터는 행벡터를 전치(Transpose)를 이용해 나타내는 경우가 있다. 행과 열 모두가 둘 이상이면 텐서가 된다.
$$\displaystyle \mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_m \end{bmatrix} \qquad \qquad \mathbf{x} = \begin{bmatrix} x_1 & x_2 & \cdots & x_m \end{bmatrix} $$
[1] 정방(正方)행렬이라고도 한다.[2] '줄'의 의미로 行을 썼을 때는 사실 '항'으로 읽어야 한다. 속음 문서 참고[3] Column에는 기둥이라는 뜻도 있다는 것을 알면 세로줄이라는 뜻도 쉽게 이해가 된다.[4] Ax = b[5] 대수학의 기본 정리,산술의 기본 정리, 미분적분학의 기본 정리와 함께 4대 정리라고 부르는 사람도 있다. 사실 이 4개의 정리 모두 대수학, 선형대수학, 해석학,정수론 등에서 중요하고 기본이 되는 정리들이다.[6] 행렬로 연립방정식을 풀어 본 사람이라면 감이 올 것이다. 이게 정의역이 두 개 이상인 함수의 맛보기이다.[7] 예를 들어 '''산업 디자인 학과'''. 이 학과의 경우 행렬은커녕 수포자 수준으로 고등학교 수학을 몰라도 전공을 배우는 데 문제가 없다 카더라.
$$\displaystyle \begin{bmatrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{bmatrix} \qquad \qquad \begin{pmatrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{pmatrix} $$
또한, 행렬 $$A$$의 $$i$$번째 행, $$j$$번째 열의 원소를 $$ A_{ij}$$로 나타낸다.
참고적으로 공과 계열에서는 벡터 형태의 변수를 나타낼 때에는 일반 괄호를 쓰고 함수를 의미하는 행렬을 나타낼 때에는 대괄호를 씀으로써 항의 의미를 명확히 하는 경우도 종종 있다. 예컨대 연립일차상미분방정식이나 고차상미분방정식에서 볼 수 있는 $$ \dot{x} = A x $$ 꼴의 수식을
$$\displaystyle \begin{pmatrix}\dot{x}_{1}\\\dot{x}_{2}\end{pmatrix} = \begin{bmatrix} A_{11} & A_{12} \\ A_{21} & A_{22} \end{bmatrix}\begin{pmatrix}x_1\\x_2\end{pmatrix} $$
2.1. 행렬의 연산(Basic operations of matrix)
2.1.1. 덧셈(Addition)
행렬의 크기가 서로 같은 경우에만 할 수 있으며, 대응하는 원소끼리 더하고 뺀다.
임의의 크기가 같은 두 행렬 $$ A $$, $$B $$에 대하여
$$(A+B)_{ij}=A_{ij}+B_{ij} $$
2.1.2. 상수배(Scalar multiplication)
모든 원소에 해당 상수를 곱한 형태가 된다. 즉, 임의의 한 행렬 $$A$$에 대하여 임의의 상수 $$k$$에 대한 상수배에 대하여
$$ (kA)_{ij}=kA_{ij} $$
2.1.3. 행렬곱(Matrix multiplication)
여타 행렬의 연산과 같이, '크기가 맞는' 경우에만 할 수 있는데, 행렬의 곱셈에서 '크기가 맞다'는 것은 앞 행렬의 열의 수[8] 와 뒤 행렬의 행의 수[9] 가 같다는 것이다. 아래 곱셈의 정의를 보면 명확할 것이다.
곱셈 결과 나오는 행렬의 크기는
('''앞''' 행렬의 '''행'''의 수) $$\times$$ ('''뒤''' 행렬의 '''열'''의 수)
행렬의 곱셈을 각 성분 관점에서 보면 곱셈과 덧셈이 아울러 이루어진다. 다르게 말하면 앞 행렬의 행벡터와 뒤 행렬의 열 벡터의 내적값을 스칼라로 가지는 새로운 행렬을 얻는 과정이 바로 행렬의 곱셈이다.
즉, 행렬곱은 '''앞 행렬의 행과 뒤 행렬의 열이 대응되는 특성'''이 있기 때문에 일반적으로 교환법칙이 성립하지 않는다. 다만, '''결합법칙은 성립한다.''' 이는 정의를 통해 쉽게 증명 가능하다.
행렬의 곱은 이렇게 부자연스럽게 정의되는데, 이는 이런 부자연스러운 정의가 선형대수학의 기본정리에서의 선형변환과 행렬 사이의 함수의 합성과 행렬의 곱을 자유롭게 오갈 수 있도록 하기 때문이다. 이 부자연스러운 정의로 인해 유한차원 벡터공간 사이의 선형변환은 행렬의 곱으로 자유롭게 바꿔 쓸 수 있으며 반대도 물론 가능한 '''둘은 완전히 동일한 대상'''으로서 취급이 가능해진다.[10] 함수의 합성으로 이해하여 결합법칙은 성립하지만 교환법칙이 성립하지 않는 것도 이러한 관점으로 설명이 가능하다.
임의의 크기가 맞는 두 행렬 $$ A$$, $$B$$에 대하여
$$(AB)_{ij}=\sum_{k} A_{ik}B_{kj} $$
[10] 예를 들어 직교행렬, 유니타리 행렬 등을 직교변환, 유니타리변환 등의 선형변환으로 쓰는 것도 문제 없이 가능하다.
$$(AB)_{ij}=\sum_{k} \overline{A_{ik}}B_{kj} = \sum_{k} A_{ik}\overline{B_{kj}}$$
2.1.3.1. 아다마르 곱(Hadamard product)
이것은 행렬곱과 다르게 같은 크기의 두 행렬의 각 성분을 곱하는 연산(Element-wise multiplication)이다. 크기가 같은 두 행렬
[math(A=\begin{bmatrix}
A_{11}&A_{12}&\dotsm&A_{1n}\\
A_{21}&A_{22}& \dotsm &A_{2n}\\
\vdots& \vdots &\ddots&\vdots\\
A_{m1}&A_{m2}&\dotsm&A_{mn}
\end{bmatrix} \qquad \qquad B=\begin{bmatrix}
B_{11}&B_{12}&\dotsm&B_{1n}\\
B_{21}&B_{22}& \dotsm &B_{2n}\\
\vdots& \vdots &\ddots&\vdots\\
B_{m1}&B_{m2}&\dotsm&B_{mn}
\end{bmatrix} )]
[math(\displaystyle A \circ B=\begin{bmatrix}
A_{11}B_{11}&A_{12}B_{12}&\dotsm&A_{1n}B_{1n}\\
A_{21}B_{21}&A_{22}B_{22}& \dotsm &A_{2n}B_{2n}\\
\vdots& \vdots &\ddots&\vdots\\
A_{m1}B_{m1}&A_{m2}B_{m2}&\dotsm&A_{mn}B_{mn}
\end{bmatrix} )]
2.1.4. 전치(Transpose)
행렬 내의 원소를 대각선축을 기준으로 서로 위치를 바꾼 것. 즉, $$ m\times n $$ 행렬의 전치행렬은 $$ n\times m $$ 행렬이 된다. 이때 기호는 전치 Transpose의 맨 앞 문자 T를 윗첨자를 사용하여 $$A^{T} $$로 나타낸다.
임의의 한 행렬 $$ A $$에 대하여
$$\displaystyle {A^{T}}_{ij}=A_{ji} $$
이 전치 연산은 텐서곱 연산의 필수요소이며, 이 연산을 복소수 범위 내에서 생각한 것이 Hermitian이다.
2.1.5. 행렬식(Determinant)
2.1.6. 주의점
- $$\boldsymbol{1 \times 1}$$ 행렬은 스칼라가 아니다.
행렬에 관해서, 특히 프로그래밍으로 행렬 개념에 입문한 사람들이 자주 하는 오해 중 하나이다. 하지만 위에 나온 행렬 곱과 스칼라 곱의 정의를 보면 알겠지만, 스칼라를 $${1 \times 1}$$ 행렬과 같은 것으로 생각하면 두 정의가 서로 충돌되기 때문에 둘은 수학적으로는 완전히 다른 개념으로 사용해서 모호함을 피하는 편이다. 애초에 속한 집합부터 다르다.
행렬의 곱셈법도 사실 행렬곱과 행렬-스칼라 곱은 정의된 집합부터 완전히 다를 수밖에 없다.
다만 MATLAB이나 NumPy 코딩은 Broadcasting이라는 개념을 통해 행렬과 $${1 \times 1}$$ 행렬 사이의 곱셈이나, 수와 $${1 \times 1}$$ 행렬 사이의 덧셈 같은 수학적으로는 말도 안 되는 것들이, 프로그래밍적 상황에서는 효율적이거나 유용하다는 이유로 정의되어 있다는 점에 유의하자.
행렬의 곱셈법도 사실 행렬곱과 행렬-스칼라 곱은 정의된 집합부터 완전히 다를 수밖에 없다.
다만 MATLAB이나 NumPy 코딩은 Broadcasting이라는 개념을 통해 행렬과 $${1 \times 1}$$ 행렬 사이의 곱셈이나, 수와 $${1 \times 1}$$ 행렬 사이의 덧셈 같은 수학적으로는 말도 안 되는 것들이, 프로그래밍적 상황에서는 효율적이거나 유용하다는 이유로 정의되어 있다는 점에 유의하자.
- 행렬곱과 내적은 다른 것이다.
백터를 행렬처럼 기술하는 경우가 많은데, 행렬곱과 내적을 같은 기호를 쓴다거나 하면 모호해지게 되니 주의하자. 두 벡터를 열벡터로 생각했을 때, 내적을 행렬곱으로 바꾸려면, 앞의 벡터에는 전치가 따라붙게 된다($$\bold{A} \cdot \bold{B} = \det (\bold{A}^T \bold{B})$$).[11] 특히 복소수 벡터의 경우 전치가 켤레 전치가 되기 때문에, 해당 개념은 혼동한 채 계산을 한다거나 프로그래밍을 하게 되면 큰 실수를 할 수 있다.
2.2. 역행렬(Inverse)
사각행렬 $$ A $$의 곱셈에 대한 역원 $$ A^{-1} $$을 말한다. 후술할 단위행렬은, 곱셈에 대한 항등원이다. 즉,
을 만족하는 유일한 $$A^{-1} $$을 말한다.[12]
이때, 주어진 행렬이 언제 가역이 되는지가 문제이다. $$ 2\times2$$ 행렬의 경우에는 아래 식에 따라 행렬식 $$ A_{11}A_{22} - A_{12}A_{21} $$이 $$ 0$$이 아니면 가역이 됨을 알 수 있다. 크기가 이보다 큰 행렬에서도 마찬가지로 행렬식만 보면 알 수 있다. 자세한 건 가역행렬의 기본정리 문서 참고. 일반적으로 $$ R$$이 $$ 1$$을 갖는 가환환일 때, $$ R$$ 위의 정사각행렬이 가역인 것과 그 행렬식이 가역인 것은 동치이다.
문제는 일반적인 $$n\times n$$ 행렬의 행렬식을 어떻게 정의하느냐 하는 것이고, 이것이 학부 선형대수학의 전반부 대부분을 차지하는 내용이다.
역행렬은 아래와 같이 정의한다.
우리가 주로 보는 $$2 \times 2$$ 행렬에 대한 역행렬은
$$\displaystyle \begin{bmatrix} A_{11} & A_{12} \\ A_{21} & A_{22} \end{bmatrix}^{-1}=\frac{1}{A_{11}A_{22}-A_{12}A_{21}}\begin{bmatrix} A_{22} & -A_{12} \\ -A_{21} & A_{11} \end{bmatrix} $$
$$\displaystyle \begin{bmatrix} A_{11} & A_{12} & A_{13} \\ A_{21} & A_{22} & A_{23} \\ A_{31} & A_{32} & A_{33} \end{bmatrix}^{-1}=\frac{1}{K} \begin{bmatrix} A_{22}A_{33}-A_{23}A_{32} & A_{13}A_{32}-A_{12}A_{33} & A_{12}A_{23}-A_{13}A_{22} \\ A_{23}A_{11}-A_{21}A_{33} & A_{11}A_{33}-A_{13}A_{31} & A_{13}A_{21}-A_{11}A_{23} \\ A_{21}A_{32}-A_{22}A_{31} & A_{12}A_{31}-A_{11}A_{32} & A_{11}A_{22}-A_{12}A_{21} \end{bmatrix} $$
$$\displaystyle K=A_{11}A_{22}A_{33} - A_{11}A_{23}A_{32} - A_{12}A_{21}A_{33} + A_{12}A_{23}A_{31} + A_{13}A_{21}A_{32} - A_{13}A_{22}A_{31} $$
2.2.1. 첨가 행렬로 역행렬 구하기(Gauss-Jordan elimination)
행렬에 다른 행렬을 첨가한 형태의 행렬을 '''첨가 행렬(Augmented Matrix)'''이라 한다. 이 방법을 통하여 역행렬을 구하는 것은 아래의 절차를 따르면 된다.
우리는 예시로써 행렬
$$\displaystyle A \equiv \begin{bmatrix} 2 & 2 & 0 \\ -2 & 1 & 1 \\ 3 & 0 & 1 \end{bmatrix} $$
[14] 한 행에 0이 아닌 상수를 곱하거나, 한 행에 다른 행을 더해주거나, 두 행의 위치를 서로 교환.
[math(\displaystyle \begin{aligned} [ A | I ] &= \left [ \begin{array} {ccc|ccc} 2 & 2 & 0 & 1 & 0 & 0 \\ -2 & 1 & 1 & 0 & 1 & 0 \\ 3 & 0 & 1 & 0 & 0 & 1 \end{array} \right] \\ &\sim \left [ \begin{array} {ccc|ccc} 2 & 2 & 0 & 1 & 0 & 0 \\ 0 & 3 & 1 & 1 & 1 & 0 \\ 3 & 0 & 1 & 0 & 0 & 1 \end{array} \right] \\ &\sim \left [ \begin{array} {ccc|ccc} 2 & 2 & 0 & 1 & 0 & 0 \\ 0 & 3 & 1 & 1 & 1 & 0 \\ 0 & -2 & 2/3 & -1 & 0 & 2/3 \end{array} \right] \\ & \sim \left [ \begin{array} {ccc|ccc} 2 & 2 & 0 & 1& 0 & 0 \\ 0 & 3 & 1 & 1 & 1 & 0 \\ 0 & 0 & 2 & -1/2 & 1 & 1 \end{array} \right] \\ &\sim \left [ \begin{array} {ccc|ccc} 2 & 2 & 0 & 1 & 0 & 0 \\ 0 & 6 & 0 & 5/2 & 1 & -1 \\ 0 & 0 & 2 & -1/2 & 1 & 1 \end{array} \right] \\ &\sim \left [ \begin{array} {ccc|ccc} 1 & 0 & 0 & 1/12 & -1/6 & 1/6 \\ 0 & 1 & 0 & 5/12 & 1/6 & -1/6 \\ 0 & 0 & 1 & -1/4 & 1/2 & 1/2 \end{array} \right]
\end{aligned} )]
$$A^{-1}=\dfrac{1}{12}\begin{bmatrix} 1 & -2 & 2 \\ 5 & 2 & -2 \\ -3 & 6 & 6 \end{bmatrix} $$
2.2.2. 크라메르 공식으로 역행렬 구하기
2.3. 특수한 행렬
2.3.1. 영행렬(Zero matrix)
모든 성분이 0인 행렬로 기호로는 $$O$$로 적는다. 이 영행렬은 행렬의 덧셈의 항등원이므로 크기가 같은 임의의 행렬 $$A$$에 대하여
$$A+ O =O+A=A$$
2.3.2. 정사각행렬(Square matrix)[15]
$$n \times n$$ 행렬을 의미한다. 아래 내용은 정사각행렬에 관한 것이다. 정사각행렬을 모두 모으면 행렬환 $$M_{n}\left(F\right)$$을 이룬다. 특히, 이 행렬환은 수학사적으로 의미가 매우 깊다. 흔히 대수학의 해방이라 일컬어지는 대수학의 인식전환의 계기가 되었다. 그전까지 모든 대수적 대상에서 교환법칙이 성립하는 줄 알았는데, 해밀턴의 사원수와 더불어, 교환법칙이 성립하지 않는 대수였기 때문이다.[16] 그리고, 행렬환은 환들 중에서 조건이 가장 열악하기 때문에, 많은 반례들을 여기서 찾을 수 있다.
2.3.3. 단위 행렬(Identity)
주대각성분은 모두 1이고 나머지 성분은 모두 0인 행렬로 기호로는 $$I$$, $$E$$ 등으로 적으며, 다음이 성립한다.
$$\displaystyle I_{ij}=\delta_{ij} $$
단위 행렬은 행렬환의 단위원, 즉, 행렬곱의 항등원이 된다. 특성상 주대각합은 행렬의 크기와 동치이다.
수치 프로그래밍에서는 n차 단위행렬 $$I_n$$을 나타내는 함수로 I와 발음이 같은 eye을 많이 사용한다.
2.3.4. 대칭 행렬(Symmetry matrix)
$$n$$차 정사각행렬 중에서, 자신의 전치행렬과 같은 행렬.
$$A=A^{T}$$
$$A_{ij}=A_{ji}$$
2.3.5. 에르미트 행렬
실수 대칭행렬을 복소수 범위로 일반화시킨 행렬로, 전치행렬의 각 원소의 켤레를 취한 행렬[약칭] 과 본 행렬이 같은 행렬을 의미한다. 즉,
의 성질을 만족하는 행렬이다. 행렬 중에서도 매우 특이한 성질이 존재[17] 하여, 선형대수에서도 매우 특별하게 취급되는 행렬이다. 자세한 것은 해당 문서를 참조하자.
2.3.6. 멱등 행렬(Idempotent matrix)
3. 기타
- 행렬(行列)은 일본식 표현으로, 일본에서는 교-레츠(行列)라고 읽는다. 중국어로는 구진(矩阵, 쥐전)이라고 부른다. 다만 행렬식이나, (행렬을 구성하는) 행, 열의 경우 한중일의 표기가 동일하다.
- 계산 노가다가 행 하나, 열 하나 더해질 때마다 무지막지하게 늘어난다. 예를 들어 행렬식을 구하는 경우, 3차 정사각행렬은 2차의 3배의 계산을, 4차 정사각행렬은 3차의 4배의 계산을 필요로 한다. 5차 정도 되면 맨손으로는 도저히 못 푼다. 뭐 다행스럽게도 실제로 풀 때는 그렇게 계산하라고 하진 않고, 가우스 소거법으로 어찌저찌 잘 풀 수는 있다. 물론 머리 아프기는 마찬가지. 다만 컴퓨터 연산에 매우 친화적이라서 슈퍼컴퓨터의 점수놀음은 대부분 행렬 연산에 기반을 둔 애플리케이션의 실행 시간으로 행해진다. 이를테면 $$y=ax²+bx+c$$와 같은 기본적인 이차방정식도 이를 컴퓨터로 하여금 계산하게 하는 것은 매우 난감하다. 사람은 직관적으로 이런 식을 이해할 수 있지만, 컴퓨터는 그렇지가 못하기 때문이다. 그러나 이를 행렬식으로 표현하면 문제는 아주 간단해진다. 그냥 곱하기 더하기 연산만 여러 번 반복하면 그게 곧 결과값이 되니까. 이는 컴퓨터에서 하나의 연산을 빠르게 하는 건 어렵지만 같은 시간에 더 많은 데이터에 대해 동일한 연산을 일률적으로 처리하는 건 쉽기 때문이다. 대표적인 예로 인텔 CPU의 MMX나 SSE, 요즘 슈퍼컴퓨팅에서 핫한 GPGPU와 FPGA가 그런 전략을 쓴다. 이런 것과 별도로 병렬 프로그래밍을 써서 멀티코어나 MPI나 Hadoop MapReduce등을 활용하는 것도 결국 이 원리에 해당한다.
- 7차 교육과정까지 정규 교육 과정에 포함되어 있었다. 학생들에게 정말 극단적인 양면성을 보여준 과목이었다. 행렬은 난이도가 쉽기 때문에 내신 대비 시험에서 학생들이 가장 편안하게 공부했던 단원이었다. 하지만 수능으로 들어오면 얘기가 달라지는데, 교과 과정 역사상 최악의 악명을 가진 반례 문제가 포함되었기 때문이다. 보기 중 맞고 틀리는 것을 고르는 문제에서 틀렸다는 것을 확인하기 위해서는 반례를 찾아내야 하는데, 이건 수학 실력과는 무관한 운에 달린 일이었기 때문이었다. 때문에 당시 최상위권 학생들 중에서는 반례 문제에 대비하기 위해 반례집을 노트로 만드는 경우도 있었는데, 반례 사례는 무한하기 때문에 소용없는 짓이었다. 결국 나중에 평가원은 반례 문제는 출제하지 않겠다고 했고, 이후 아예 정규 교과 과정에서 행렬 단원 자체가 빠지게 되었다. 이 때문에 벡터와 함께 자연·공학계 대학 교수들은 '이런 기본적인 것도 안 배우고 오면 어떡하냐'고 불만을 표시했지만 말했듯이 반례문제는 답이 없기 때문.
3.1. 프로그래밍
- Dense Matrix
사각형 모양의 배열에 행렬의 모든 값을 담는 것으로, 수학에서 사용되는 행렬과 똑같이 사용할 수 있기 때문에, 알고리즘도 그대로 적용 가능하고 프로그래밍하기 쉽다. 다만, 행렬에 0이 많으면 메모리를 많이 잡아먹고 쓸데없는 계산도 늘어나기 때문에 비효율적이라는 단점이 존재한다. 그런데, GPGPU의 압도적인 계산 능력을 활용할 수 있다면, 그냥 0은 무시하고 배열을 써서 쉽게 구현하고 모든 계산은 GPGPU 에게 맡겨 버리는 것이 여러 모로 유리하다.
- Sparse Matrix
- CSR Matrix
- CSC Matrix
- DOK Matrix
- Banded Matrix
Dense Matrix와 달리 Ragged Array나 Hash Table형의 자료 구조를 이용해 필요한(0이 아닌) 숫자만 압축해서 기술하는 방법이다. 행렬의 구성요소에 접근하는 방법이 아예 달라지니, Decomposition 같은 알고리즘을 구현하려면 머리를 좀 써야 한다.
Finite Difference 같은 유형의 문제를 풀다 보면 알겠지만, 행렬로 모델링 했을 때 대각선 부분에 0이 아닌 숫자가 집중되는 경우가 많고, 이런 경우 특수한 알고리즘을 이용해 Gaussian Elimination 같은 문제를 효율적으로 풀 수 있다는 것을 알 수 있다. 과학이나 공학 문제에는 이런 유형의 문제가 스케일만 커진 채로 자주 등장하기 때문에, 행렬의 특성을 잘 공부해서 위에 나온 다양한 종류의 Sparse Matrix 중 하나로 모델링 하면 문제를 더 효율적으로 풀 수 있다.
다만 행렬의 모양이 위에 말한 Sparse Matrix마다의 권장되는 규격과 다르거나, 0이 별로 없는 행렬이 나온다면 Sparse Matrix를 이용하는 것이 오히려 더 비효율적일 수 있으므로 주의하도록 하자.
Finite Difference 같은 유형의 문제를 풀다 보면 알겠지만, 행렬로 모델링 했을 때 대각선 부분에 0이 아닌 숫자가 집중되는 경우가 많고, 이런 경우 특수한 알고리즘을 이용해 Gaussian Elimination 같은 문제를 효율적으로 풀 수 있다는 것을 알 수 있다. 과학이나 공학 문제에는 이런 유형의 문제가 스케일만 커진 채로 자주 등장하기 때문에, 행렬의 특성을 잘 공부해서 위에 나온 다양한 종류의 Sparse Matrix 중 하나로 모델링 하면 문제를 더 효율적으로 풀 수 있다.
다만 행렬의 모양이 위에 말한 Sparse Matrix마다의 권장되는 규격과 다르거나, 0이 별로 없는 행렬이 나온다면 Sparse Matrix를 이용하는 것이 오히려 더 비효율적일 수 있으므로 주의하도록 하자.
4. 관련 문서
[17] 예를 들어서, 모든 에르미트 행렬은 그 고유값이 반드시 실수가 되며, 서로 다른 고유벡터를 취하면 반드시 서로 직교하게 되는 등 여러 독특한 성질을 지니고 있다..