Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

두 행렬의 곱셈을 계산하는 파이썬 프로그램

이번 글에서는 사용자로부터 두 개의 N×N 행렬을 입력받아 그 곱셈 결과를 화면에 출력하는 파이썬 프로그램을 살펴봅니다. 행렬 데이터는 중첩 리스트(nested list)로 저장하고, 연산 과정은 중첩 for 반복문으로 처리합니다.

알고리즘

  1. 입력 단계: 두 개의 행렬을 사용자로부터 입력받습니다.
  2. 순회 단계: 중첩 for 반복문으로 첫 번째 행렬의 각 행과 두 번째 행렬의 각 열을 차례대로 순회합니다.
  3. 연산 단계: 모든 요소가 0으로 초기화된 결과 행렬(resultant matrix)을 준비합니다. 첫 번째 행렬의 행 요소와 두 번째 행렬의 열 요소를 하나씩 곱한 뒤 모두 더하면, 그 합이 결과 행렬의 해당 위치 값이 됩니다.

예제 코드

# 두 행렬을 곱하는 프로그램
A = []
n = int(input("N x N 행렬의 크기 N을 입력하세요: "))
print("행렬의 원소를 입력하세요 ::>")
for i in range(n):
   row = []                                # 행을 저장할 임시 리스트
   for j in range(n):
      row.append(int(input()))             # 입력값을 행 리스트에 추가
   A.append(row)                           # 완성된 행을 행렬 A에 추가
print(A)

# 2차원 배열을 행렬 형태로 출력
print("행렬 형태로 배열 출력")
for i in range(n):
   for j in range(n):
      print(A[i][j], end=" ")
   print()                                 # 줄바꿈

B = []
n = int(input("N x N 행렬의 크기 N을 입력하세요 : "))   # 여기서는 3 입력
# 2차원 배열을 저장할 리스트 사용
# 사용자 입력을 받아 리스트에 저장 (여기서는 1~9 입력)
print("행렬의 원소를 입력하세요 ::>")
for i in range(n):
   row = []                                # 행을 저장할 임시 리스트
   for j in range(n):
      row.append(int(input()))             # 입력값을 행 리스트에 추가
   B.append(row)                           # 완성된 행을 행렬 B에 추가
print(B)

# 2차원 배열을 행렬 형태로 출력
print("행렬 형태로 배열 출력")
for i in range(n):
   for j in range(n):
      print(B[i][j], end=" ")
   print()

# 행렬 곱셈 수행
result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
for i in range(len(A)):
   for j in range(len(B[0])):
      for k in range(len(B)):
         result[i][j] += A[i][k] * B[k][j]

print("결과 행렬은 다음과 같습니다 ::>")
for r in result:
   print(r)

핵심 코드 분석

행렬 곱셈 로직의 핵심은 아래처럼 세 겹으로 중첩된 반복문입니다.

result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
for i in range(len(A)):
   for j in range(len(B[0])):
      for k in range(len(B)):
         result[i][j] += A[i][k] * B[k][j]
  • i: 결과 행렬의 행(row) 인덱스
  • j: 결과 행렬의 열(column) 인덱스
  • k: 두 행렬의 요소를 곱한 값을 누적으로 더하기 위해 사용하는 인덱스

result[i][j] += A[i][k] * B[k][j] 연산은 선형대수학에서 정의하는 행렬 곱셈 공식을 그대로 코드로 옮긴 것입니다. 참고로 이 삼중 반복문 방식의 시간 복잡도는 O(N³)입니다.

실행 결과

N x N 행렬의 크기 N을 입력하세요: 3
행렬의 원소를 입력하세요 ::>
2
1
4
2
1
2
3
4
3
[[2, 1, 4], [2, 1, 2], [3, 4, 3]]
행렬 형태로 배열 출력
2 1 4
2 1 2
3 4 3
N x N 행렬의 크기 N을 입력하세요 : 3
행렬의 원소를 입력하세요 ::>
1
2
3
4
5
6
7
8
9
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
행렬 형태로 배열 출력
1 2 3
4 5 6
7 8 9
결과 행렬은 다음과 같습니다 ::>
[34, 41, 48]
[20, 25, 30]
[40, 50, 60]