두 행렬의 곱셈은 첫 번째 행렬의 열(column) 개수와 두 번째 행렬의 행(row) 개수가 같을 때에만 가능합니다. 이 조건이 충족되지 않으면 행렬 곱셈을 수행할 수 없습니다.
행렬 곱셈의 기본 원리
파이썬에서는 중첩 루프(nested loop)를 사용하여 행렬 곱셈을 구현할 수 있습니다. 아래 예제 프로그램은 각각 3개의 행과 3개의 열을 가진 두 행렬 X와 Y를 다룹니다. 곱셈 결과로 생성되는 행렬 Z 역시 3×3 구조를 갖게 됩니다.
행렬 곱셈의 핵심 원리는 다음과 같습니다. 첫 번째 행렬의 각 행에 있는 요소들을 두 번째 행렬의 해당 열에 있는 요소들과 하나씩 곱한 후, 그 결과를 모두 더하여 새로운 행렬의 요소를 만듭니다.
예제 코드
X = [[1,2,3],
[4,5,6],
[7,8,9]]
Y = [[10,11,12],
[13,14,15],
[16,17,18]]
result = [[0,0,0],
[0,0,0],
[0,0,0]]
# X의 행을 순회
for i in range(len(X)):
for j in range(len(Y[0])):
for k in range(len(Y)):
result[i][j] += X[i][k] * Y[k][j]
for r in result:
print(r)실행 결과
[84, 90, 96] [201, 216, 231] [318, 342, 366]
코드 동작 방식 설명
위 코드에서 세 개의 중첩된 for 루프가 사용됩니다.
첫 번째 루프(i)는 첫 번째 행렬 X의 행을 순회하고, 두 번째 루프(j)는 두 번째 행렬 Y의 열을 순회하며, 세 번째 루프(k)는 실제 곱셈과 덧셈 연산을 수행합니다.
예를 들어 result[0][0] 값인 84는 다음과 같이 계산됩니다.
(1×10) + (2×13) + (3×16) = 10 + 26 + 48 = 84
NumPy를 활용한 더 간단한 방법
실무에서는 NumPy 라이브러리를 사용하면 훨씬 간결하게 행렬 곱셈을 수행할 수 있습니다.
import numpy as np X = np.array([[1,2,3],[4,5,6],[7,8,9]]) Y = np.array([[10,11,12],[13,14,15],[16,17,18]]) result = np.dot(X, Y) print(result)
NumPy의 np.dot() 함수 또는 @ 연산자를 사용하면 내부적으로 최적화된 연산이 수행되어, 큰 규모의 행렬에서도 중첩 루프 방식보다 훨씬 빠른 성능을 보여줍니다.