본문 바로가기
작업/Programming

C언어 행렬의 곱 구하기

 

 

 

3 x 2 행렬과 2 x 3 행렬을 곱한다고 한다면
결과로 3 x 3 행렬이 나오게 됩니다.


A x B,  B x C에서 처음 행렬의 열(B)다음 행렬의 행(B)이 같은 수여야 곱이 가능하며
곱의 결과로 A x C의 행렬이 나오게 되는 것입니다. 


계산 방법은
처음 행렬에서는 행에 포함된 값들과
다음 행렬에서 열에 포함된 값들을 순서대로 곱하고
그 값들을 더하는 것입니다.

 

 

행렬의 곱 과정

 

 // 행렬의 곱
    int value1[][2] = {3, 5, 4, 2, 5, 7};
    int value2[][3] = {3, 8, 2, 2, 4, 6};
    int mul; //곱의 값 저장

    // 3x2 와 2x3의 결과는 3x3
    for(int i=0; i<3; i++){
        for(int j=0; j<3; j++){
            mul = 0; //초기화
            for(int k=0; k<2; k++){ 
                mul += (value1[i][k]*value2[k][j]);
            }
            printf("%d ", mul);
        }
        printf("\n"); // 행렬 시각화
    }

 

 

 

 

행렬의 곱을 반복문을 통해 구하고, 그 값을 바로 출력할 수 있도록 코드를 만들었습니다.
배열의 인덱스를 기준으로 행렬의 곱이 어떻게 진행되는지 아래를 참고하세요.

 

3x2 와 2x3 행렬의 곱은 3x3
행렬의 곱 (인덱스)

 

 

2차원 배열에서는 행을 기준으로 값을 다 채운 후 다음 행의 값을 채우기 때문에
반복문의 구성은 오른쪽(열 방향)으로 먼저 순회되고,  다음 행을 순회할 수 있도록 합니다.


1행을 기준으로 인덱스의 값이 어떻게 변화되는지 확인해 봅시다.
3x2 행렬의 인덱스는 빨강,  2x3 행렬의 인덱스는 갈색으로 구분했습니다.

 

 

 

 

 

행렬 곱셈 사이클 분석

 

 

1행을 기준으로 보면 빨강의 인덱스는 행을 나타내는 인덱스가 [0]으로 고정되어 있고,
열을 나타내는 인덱스가 [0], [1]로 반복해서 변경됩니다.


갈색의 인덱스는 행을 나타내는 인덱스가 [0], [1]로 반복해서 변경되고 있습니다.
열을 나타내는 인덱스는 한 번의 연산마다 값이 고정되고, 다음 연산 시 1씩 증가합니다.


한 번의 연산에서 변경되는 인덱스는 빨강의 열과 갈색의 행이며 0과 1입니다.
1행의 사이클을 도는 동안 갈색의 열 인덱스는 0, 1, 2의 인덱스를 사용했습니다.
1행의 사이클을 도는 동안 빨강의 행 인덱스는 변하지 않았으며 다음 행이 되었을 경우 값이 1 증가했습니다.

 

 

 

분석 결과

 

 

반복문으로 구성하기 위해서는 3가지가 필요합니다.

 


1행을 1사이클이라 한다면 총 3사이클이 필요합니다. (결과 행렬의 행이 3이기 때문)
1사이클 안에는 총 3번의 연산을 진행해야 합니다. (결과 행렬의 열이 3이기 때문)
1번의 연산에서 인덱스의 값이 변경되는 경우가 있으며 그것은 0, 1의 값을 가집니다.


시작 for문을 을 순환하는 사이클,
중간 for문을 을 순환하는 사이클,
마지막 for문을 연산에서의 인덱스 값을 순환하는 사이클로 지정을 한다면


행렬의 곱을 만들 수 있게 됩니다.

 

 

 

 

최종 결론

 

A x B,  B x C의 행렬을 곱하여 A x C 행렬을 만들고 싶을 때


시작 for문의 반복 횟수는 결과 행렬의 행(A)의 수만큼,
중간 for문의 반복 횟수는 결과 행렬의 열(C)의 수만큼,
연산에서의 인덱스를 순환하기 위한 반복 횟수는 두 행렬 곱의 가운데(B) 수만큼 합니다.

 

 

 


행렬의 곱셈 알고리즘 이해에 도움이 되었길 바랍니다.

 


-끝-