행렬(matrix)은 숫자들을 행(row)과 열(column)의 형태로 배열한 직사각형 배열입니다. 수학뿐만 아니라 그래픽 처리, 데이터 분석 등 다양한 분야에서 널리 활용되는 기본 개념입니다.
예를 들어, 3×3 행렬은 아래와 같이 3개의 행과 3개의 열로 구성됩니다.
8 6 3 7 1 9 5 1 9
이 글에서는 C++의 다차원 배열(2차원 배열)을 사용하여 두 행렬을 곱하는 방법을 실제 코드와 함께 단계별로 살펴보겠습니다.
전체 예제 코드
#include<iostream>
using namespace std;
int main() {
int product[10][10], r1=2, c1=3, r2=3, c2=3, i, j, k;
int a[2][3] = { {2, 4, 1} , {2, 3, 9} };
int b[3][3] = { {1, 2, 3} , {3, 6, 1} , {2, 9, 7} };
if (c1 != r2) {
cout<<"Column of first matrix should be equal to row of second matrix";
} else {
cout<<"The first matrix is:"<<endl;
for(i=0; i<r1; ++i) {
for(j=0; j<c1; ++j)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"The second matrix is:"<<endl;
for(i=0; i<r2; ++i) {
for(j=0; j<c2; ++j)
cout<<b[i][j]<<" ";
cout<<endl;
}
cout<<endl;
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j) {
product[i][j] = 0;
}
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j)
for(k=0; k<c1; ++k) {
product[i][j]+=a[i][k]*b[k][j];
}
cout<<"Product of the two matrices is:"<<endl;
for(i=0; i<r1; ++i) {
for(j=0; j<c2; ++j)
cout<<product[i][j]<<" ";
cout<<endl;
}
}
return 0;
}실행 결과
The first matrix is: 2 4 1 2 3 9 The second matrix is: 1 2 3 3 6 1 2 9 7 Product of the two matrices is: 16 37 17 29 103 72
코드 상세 설명
1. 행렬 초기화
위 프로그램에서는 두 개의 행렬 a와 b를 다음과 같이 선언하고 초기화합니다. 행렬 a는 2×3 크기, 행렬 b는 3×3 크기를 가집니다.
int a[2][3] = { {2, 4, 1} , {2, 3, 9} };
int b[3][3] = { {1, 2, 3} , {3, 6, 1} , {2, 9, 7} };2. 행렬 곱셈 가능 여부 확인
행렬 곱셈이 성립하려면 첫 번째 행렬의 열 개수가 두 번째 행렬의 행 개수와 일치해야 합니다. 이 조건이 만족되지 않으면 곱셈을 수행할 수 없으며, 이 경우 오류 메시지를 출력하도록 처리했습니다.
if (c1 != r2) {
cout<<"Column of first matrix should be equal to row of second matrix";
}3. 행렬 출력하기
두 행렬 a와 b는 중첩 for 루프(nested loop)를 사용하여 화면에 출력됩니다. 바깥쪽 루프는 행을, 안쪽 루프는 열을 순회하면서 각 요소를 차례대로 출력합니다.
cout<<"The first matrix is:"<<endl;
for(i=0; i<r1; ++i) {
for(j=0; j<c1; ++j)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"The second matrix is:"<<endl;
for(i=0; i<r2; ++i) {
for(j=0; j<c2; ++j)
cout<<b[i][j]<<" ";
cout<<endl;
}
cout<<endl;4. 행렬 곱셈 수행
먼저 결과를 저장할 product[][] 배열의 모든 요소를 0으로 초기화합니다. 이후 세 개의 중첩 for 루프를 사용하여 두 행렬 a와 b의 곱을 계산합니다. 각 결과 요소는 첫 번째 행렬의 행 요소와 두 번째 행렬의 열 요소를 순서대로 곱한 후 모두 더한 값입니다.
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j) {
product[i][j] = 0;
}
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j)
for(k=0; k<c1; ++k) {
product[i][j]+=a[i][k]*b[k][j];
}5. 곱셈 결과 출력
곱셈이 완료되면 product 배열에 저장된 최종 결과를 중첩 for 루프를 통해 화면에 출력합니다.
cout<<"Product of the two matrices is:"<<endl;
for(i=0; i<r1; ++i) {
for(j=0; j<c2; ++j)
cout<<product[i][j]<<" ";
cout<<endl;
}마무리
이처럼 C++의 2차원 배열과 중첩 반복문만으로도 행렬 곱셈을 손쉽게 구현할 수 있습니다. 행렬 곱셈의 시간 복잡도는 O(n³)이므로, 행렬의 크기가 커질수록 연산량이 빠르게 증가한다는 점도 함께 기억해 두면 좋습니다.