[include(틀:선형대수학)] [목차] == 개요 == {{{+2 Matrix Multiplication}}} [[행렬(수학)|행렬]]의 곱셈은 여타 행렬의 연산과 같이 '크기가 맞는' 경우에만 정의되는데, 행렬의 곱셈에서 '크기가 맞는다'는 것은 앞 행렬의 열의 수[* 한 행이 몇 개의 원소로 되어 있는지]와 뒷 행렬의 행의 수[* 한 열이 몇 개의 원소로 되어 있는지]가 같다는 것이다. 아래 곱셈의 정의를 보면 명확할 것이다. 곱셈 결과 나오는 행렬의 크기는 {{{#!wiki style="text-align: center" [br]{{{+1 ({{{#blue '''앞'''}}} 행렬의 [[행#행(行), 가로줄|{{{#blue '''행'''}}}]]의 수) [math(\times)] ({{{#red '''뒤'''}}} 행렬의 [[열(동음이의어)#열(列), 세로 줄|{{{#red '''열'''}}}]]의 수)}}}}}} 가 된다. 즉, 앞 행렬의 크기가 [math({\color{blue}m}\times n)]이고 뒷 행렬의 크기가 [math(n\times{\color{red}r})]인 경우, 곱셈 결과 나오는 행렬의 크기는 [math({\color{blue}m}\times{\color{red}r})]이 된다. == 부자연스럽게 정의되는 이유 == 행렬의 곱은 이렇게 꼬인다는 말이 나올 만큼 부자연스럽게 정의되는데, 이는 이런 부자연스러운 정의가 [[선형대수학의 기본정리]]에서의 [[선형변환]]과 [[행렬]] 사이의 함수의 합성과 행렬의 곱을 자유롭게 오갈 수 있도록 하기 때문이다. 이 부자연스러운 정의로 인해 유한차원 벡터공간 사이의 선형변환은 행렬의 곱으로 자유롭게 바꿔 쓸 수 있으며 반대도 물론 가능하다. 즉, '''둘은 완전히 동일하게 기능'''한다.[* 예를 들어 직교행렬, 유니타리 행렬 등을 직교변환, 유니타리변환 등의 선형변환으로 쓰는 것도 문제 없이 가능하다.] 함수의 합성으로 이해하여 결합법칙은 성립하지만 교환법칙이 성립하지 않는 것도 이러한 관점으로 설명이 가능하다. 즉, 행렬은 선형대수학에서는 '''일종의 함수'''라고 할 수 있다. == 계산 방법 == 두 행렬 [math(A, B)]가 각각 [math(m\times n, n\times r)] 행렬일 때, [math(A=\begin{pmatrix}a_{11} & a_{12} & \cdots & a_{1n} \\ {\color{blue}a_{21}} & {\color{blue}a_{22}} & {\color{blue}\cdots} & {\color{blue}a_{2n}} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn}\end{pmatrix}, B=\begin{pmatrix}{\color{red}b_{11}} & b_{12} & \cdots & b_{1r} \\ {\color{red}b_{21}} & b_{22} & \cdots & b_{2r} \\ {\color{red}\vdots} & \vdots & \ddots & \vdots \\ {\color{red}b_{n1}} & b_{n2} & \cdots & b_{nr}\end{pmatrix})] 이라고 하면 행렬의 곱 [math(AB)]는 [math(m\times r)] 행렬이며, [math(AB=\begin{pmatrix}\sum_k a_{1k}b_{k1} & \sum_k a_{1k}b_{k2} & \cdots & \sum_k a_{1k}b_{kr} \\ {\color{#C0C}\sum_k a_{2k}b_{k1}} & \sum_k a_{2k}b_{k2} & \cdots & \sum_k a_{2k}b_{kr} \\ \vdots & \vdots & \ddots & \vdots \\ \sum_k a_{mk}b_{k1} & \sum_k a_{mk}b_{k2} & \cdots & \sum_k a_{mk}b_{kr}\end{pmatrix})] 이다. (단, [math(k=1,2,...,n)]) 여기서 [math(AB)]의 [math(i)]행 [math(j)]열의 성분은 [math(\sum_k a_{ik}b_{kj})]로, [[내적|[math(A)]의 [math(i)]행의 각 성분과 [math(B)]의 [math(j)]열의 대응되는 성분의 곱을 모두 합한 것]]과 같다. 예를 들어 [math(AB)]의 2행 1열의 성분은 [math(\color{#C0C}{\sum_k a_{2k}b_{k1}})]로, [math(A)]의 {{{#blue 2행}}}의 각 성분과 [math(B)]의 {{{#red 1열}}}의 대응되는 성분끼리 모두 곱한 것을 합한 것과 같다. 따라서 [math(AB)]의 각 성분을 구하기 위해 필요한 [math(A, B)]의 성분의 개수는 각각 [math(n)]개임을 알 수 있다. 이를 보다 간단히 나타내면, 임의의 크기가 맞는 두 행렬 [math(A)], [math(B)]에 대하여 {{{#!wiki style="text-align: center" [br][math((AB)_{ij}=\sum_{k} A_{ik}B_{kj} )]}}} 이 성립한다. 복소행렬일 경우 [[에르미트 내적|에르미트성]]에 의해 {{{#!wiki style="text-align: center" [br][math((AB)_{ij}=\sum_{k} \overline{A_{ik}}B_{kj} = \sum_{k} A_{ik}\overline{B_{kj}})]}}} 로 바뀐다. 다음과 같이 생각하면 보다 이해하기 편하다. 행렬 [math(A, B)]에 대하여 그 곱 [math(AB)]를 구할 때, || || [math(B)] || || [math(A)] || [math(AB)] || 와 같이 배치하고, [math(AB)]의 각 성분 [math((AB)_{ij})]에 대해 그 성분이 있는 자리의 왼쪽에 있는 [math(A)]의 [math(i)]행과 위쪽에 있는 [math(B)]의 [math(j)]열을 찾는다. 그 행과 열의 대응되는 성분끼리의 곱의 합이 바로 그 성분의 값이 된다. 예를 들어 [math(A=\begin{pmatrix}1 & 2 \\ 3 & 4\end{pmatrix}, B=\begin{pmatrix}5 & 6 \\ 7 & 8\end{pmatrix})] 일 때, || || [math(\begin{pmatrix}5 & {\color{red}6} \\ 7 & {\color{red}8}\end{pmatrix})] || || [math(\begin{pmatrix}{\color{blue}1} & {\color{blue}2} \\ 3 & 4\end{pmatrix})] || [math(\begin{pmatrix}19 & {\color{#C0C}22} \\ 43 & 50 \end{pmatrix})] || 여기서 [math((AB)_{12})]에 해당하는 값인 22는 [math(A)]의 1행과 [math(B)]의 2열의 대응되는 성분끼리의 곱의 합에 해당한다. 즉 다음과 같다. * [math({\color{blue}A_{11}}\times{\color{red}B_{12}}+{\color{blue}A_{12}}\times{\color{red}B_{22}}={\color{#C0C}(AB)_{12}})] * [math({\color{blue}1}\times{\color{red}6}+{\color{blue}2}\times{\color{red}8}={\color{#C0C}22})] 한편, [math(A)], [math(B)]에 [[허수단위]] [math(i)]를 곱한 복소행렬의 곱을 생각해보자. 두 행렬 중 한 행렬의 허수부 부호가 반대가 되므로, 아래와 같이 된다. || || [math(\begin{pmatrix}5i & {\color{red}6i} \\ 7i & {\color{red}8i}\end{pmatrix})] || || [math(\begin{pmatrix}{\color{blue}i} & {\color{blue}2i} \\ 3i & 4i\end{pmatrix})] || [math(\begin{pmatrix}19 & {\color{#C0C}22} \\ 43 & 50 \end{pmatrix})] || * [math({\color{blue}\overline{A_{11}}}\times{\color{red}B_{21}}+{\color{blue}\overline{A_{12}}}\times{\color{red}B_{22}} = {\color{blue}A_{11}}\times{\color{red}\overline{B_{21}}}+{\color{blue}A_{12}}\times{\color{red}\overline{B_{22}}} ={\color{#C0C}(\overline{A}B)_{12}} ={\color{#C0C}(A\overline{B})_{12}})] * [math({\color{blue}-i}\times{\color{red}6i}+{\color{blue}-2i}\times{\color{red}8i} = {\color{blue}i}\times{\color{red}-6i}+{\color{blue}2i}\times{\color{red}-8i}={\color{#C0C}22})] === 예시 === 어느 학교에는 우등생을 따로 모아서 교육시키는 특별반인 '우수반'과 '수학반'이 있으며, 이들 반에서 학생을 선발하기 위해서 국어, 수학, 영어 과목에 각각 가중치를 둔다고 하자. || || 국어 || 수학 || 영어 || || 김 || 80 || 90 || 60 || || 이 || 75 || 80 || 90 || || 박 || 90 || 95 || 65 || || 최 || 99 || 70 || 70 || <표 A: 각 학생의 과목별 성적> || || 우수반 || 수학반 || || 국어 || 3 || 1 || || 수학 || 3 || 8 || || 영어 || 4 || 1 || <표 B: 각 반의 과목별 가중치> 위와 같은 <표 A>와 <표 B>를 이용하여 김, 이, 박, 최 4명의 학생이 이들 각 반에 들어가려고 할 때의 가중치를 이용한 세 과목의 총점을 구하려고 한다. 이때 각 과목별로 (점수 × 가중치)의 총합을 계산하면 되는데, 여기서 행렬을 이용하면 편리하다. [math(A=\begin{pmatrix}80 & 90 & 60 \\ 75 & 80 & 90 \\ 90 & 95 & 65 \\ 99 & 70 & 70\end{pmatrix}, B=\begin{pmatrix}3 & 1 \\ 3 & 8 \\ 4 & 1\end{pmatrix})] 일 때, [math(AB=\begin{pmatrix}80\cdot3+90\cdot3+60\cdot4 & 80\cdot1+90\cdot8+60\cdot1 \\ 75\cdot3+80\cdot3+90\cdot4 & 75\cdot1+80\cdot8+90\cdot1 \\ 90\cdot3+95\cdot3+65\cdot4 & 90\cdot1+95\cdot8+65\cdot1 \\ 99\cdot3+70\cdot3+70\cdot4 & 99\cdot1+70\cdot8+70\cdot1\end{pmatrix}=\begin{pmatrix}750 & 860 \\ 825 & 805 \\ 815 & 915 \\ 787 & 729\end{pmatrix})] 이다. 따라서 각 학생의 각 반별 가중치를 이용한 총점은 다음 표와 같다. 보다시피 앞 행렬의 행인 학생과 뒤 행렬의 열인 반이 대응되는 것을 볼 수 있다. || || 우수반 || 수학반 || || 김 || 750 || 860 || || 이 || 825 || 805 || || 박 || 815 || 915 || || 최 || 787 || 729 || === 연산 횟수 === 상기와 같이 정의된 두 행렬 [math(A, B)]의 곱 [math(AB)]를 계산하기 위한 연산 횟수는 다음과 같다. 먼저 [math(AB)]의 각 성분은 [math(\sum_k a_{ik}b_{kj})] (단, [math(i=1,2,...,m, j=1,2,...,r, k=1,2,...,n)])로 정의되므로, 이를 계산하기 위해 덧셈과 곱셈은 각각 [math(n)]회 필요하다. 또한 [math(AB)]의 성분의 개수는 [math(mr)]이므로, 전체 행렬곱을 계산하는 데 덧셈과 곱셈은 각각 [math(mnr)]회 필요하다. 따라서 총 연산 횟수는 [math(2mnr)]이다. 세 행렬 [math(A, B, C)]의 크기가 각각 [math(a\times b, b\times c, c\times d)]일 때, 이들의 곱셈에 대한 결합법칙이 성립하므로 곱하는 순서에 따라 결과가 달라지지 않는다. 단 다음과 같이 '''곱하는 순서에 따라 연산 횟수가 달라진다.'''[* [[컴퓨터공학]]에서 이것이 중요한 의미를 갖는데, 행렬을 곱하는 [[알고리즘]]의 [[시간 복잡도]]가 계산 순서에 따라 크게 달라질 수 있기 때문이다.] [math(AB, BC)]가 각각 [math(a\times c, b\times d)] 크기의 행렬임에 유의한다. 덧셈과 곱셈의 연산 횟수가 같으므로 여기서는 덧셈의 연산 횟수를 기준으로 한다. * [math((AB)C)] : [math(abc+acd=ac(b+d))]회 * [math(A(BC))] : [math(abd+bcd=bd(a+c))]회 따라서 [math(A(BC))]의 순서로 곱하는 것이 더 빠르려면 [math(bd(a+c)1)]인 걸음의 수 구하기 === [[선형변환]]의 [[행렬표현]]과 행렬곱 === 대칭변환, 회전변환과 같은 선형변환의 행렬표현에서 다음과 같은 의미를 갖는다. * 선형변환 [math(T_A, T_B)]의 행렬표현을 각각 [math(A, B)]라 하면, [math(AB)]는 어떤 도형에 [math(T_B)]를 적용하여 변환시킨 다음에 [math(T_A)]를 적용하여 또 한번 변환시키는 것을 의미한다. (합성변환) * 특정 행렬표현의 n제곱은 해당 선형변환을 n번 반복한다는 것을 의미한다. 따라서 다음과 같다. * 원점 대칭변환, 특정 직선에 대한 대칭변환, 3차원 이상의 좌표계에서 특정 평면, 입체 등에 대한 대칭변환 등 대부분의 대칭변환의 행렬표현의 제곱은 단위행렬 [math(I)]이다. * 원점을 중심으로 [math(\theta)]만큼 회전시키는 회전변환 행렬의 [math(\displaystyle\frac{2n\pi}{\theta})] (단, [math(n=1,2,...)])제곱은 단위행렬이다. [include(틀:문서 가져옴, title=행렬(수학),paragraph=2.1.3,version=83, title2=행렬(수학),version2=83, paragraph2=2.1.3.1)] [[분류:선형대수학]]