Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 다차원 배열로 두 행렬 곱하기: 코드 예제와 자세한 설명

행렬(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³)이므로, 행렬의 크기가 커질수록 연산량이 빠르게 증가한다는 점도 함께 기억해 두면 좋습니다.