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

C++에서 함수로 행렬을 전달해 두 행렬의 곱 구하기

행렬(matrix)은 숫자들을 행(row)과 열(column) 형태로 배열한 직사각형 배열입니다.

예를 들어, 아래와 같은 행렬이 있을 수 있습니다.

3×4 행렬은 아래와 같이 3개의 행과 4개의 열로 구성됩니다.

8 6 3 5
7 1 9 2
5 1 9 8

행렬 곱셈 프로그램 예제

다음은 두 개의 행렬을 함수에 인수로 전달하여 곱하는 C++ 프로그램입니다.

#include<iostream>
using namespace std;
void MatrixMultiplication(int a[2][3],int b[3][3]) {
    int product[10][10], r1=2, c1=3, r2=3, c2=3, i, j, k;
    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;
        }
    }
}
int main() {
    int a[2][3] = { {2, 4, 1} , {2, 3, 9} };
    int b[3][3] = { {1, 2, 3} , {3, 6, 1} , {2, 9, 7} };
    MatrixMultiplication(a,b);
    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. 행렬 초기화 및 함수 호출

위 프로그램에서는 main() 함수 안에서 두 행렬 ab를 다음과 같이 초기화합니다.

int a[2][3] = { {2, 4, 1} , {2, 3, 9} };
int b[3][3] = { {1, 2, 3} , {3, 6, 1} , {2, 9, 7} };

그런 다음 두 행렬을 인수로 넘겨 MatrixMultiplication() 함수를 호출합니다.

MatrixMultiplication(a,b);

2. 곱셈 가능 여부 검사

행렬 곱셈이 성립하려면 첫 번째 행렬의 열 개수가 두 번째 행렬의 행 개수와 같아야 합니다. 이 조건이 만족되지 않으면 곱셈을 수행할 수 없으므로 오류 메시지를 출력합니다.

if (c1 != r2) {
    cout<<"Column of first matrix should be equal to row of second matrix";
}

3. 행렬 출력

두 행렬 ab는 중첩된 for 반복문을 사용하여 화면에 출력됩니다.

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 반복문을 사용하여 두 행렬의 곱을 계산합니다.

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];
}

여기서 핵심 공식은 product[i][j] += a[i][k] * b[k][j]입니다. 즉, 결과 행렬의 각 요소는 첫 번째 행렬의 행 요소와 두 번째 행렬의 열 요소를 순서대로 곱한 뒤 모두 더한 값입니다.

5. 결과 출력

곱셈 결과가 계산되면 이를 화면에 출력합니다.

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;
}

정리

이 프로그램은 행렬을 2차원 배열 형태로 함수에 전달하고, 곱셈 가능 조건(첫 행렬의 열 수 = 둘째 행렬의 행 수)을 확인한 후 삼중 반복문으로 곱을 계산하는 표준적인 방법을 보여줍니다. 시간 복잡도는 O(r1 × c2 × c1)이며, 행렬 크기가 커질수록 계산량이 세제곱 수준으로 증가한다는 점을 기억하면 좋습니다.