NLP Learner in Switzerland

[C] Matrix Multiplication ::: 행렬의 곱 본문

Algorithm in C/Exercise

[C] Matrix Multiplication ::: 행렬의 곱

초코빵 2021. 3. 29. 07:00
728x90
반응형

 

 


까다로운 부분 알아가기


[1] matrix의 size는 3 x 3이다.

▶ size = 3을 const qualifier를 사용해서 제한시켜준다.

▶ 이렇게 하면 function parameter에 넣어줄 수 있다. (int A[][]는 에러난다)

 

[2] 2차원 matrix의 구성은? row(행) x column(열)

▶ matrix 는 multidimensional array로 표현한다. 2차원인 경우에는 A[size][size], 3차원인 경우에는 A[size][size][size]의 형태로 초기화 한다. size를 선언하지 않고도 할 수 있는 다른 방법이 있겠지만 아직 초심자이므로 모르기로 하자.

 

[3] 행렬곱 AB의 각 원소에 넣어줄 변수가 필요하다.

이 변수를 sum으로 선언했고, 최초에 0으로 초기화 해주어야 함에 주의. 변수 선언만 하면 이상한 숫자가 출력될 수 있다.

▶ 루프를 돌면서 sum값(AB의 원소값)이 정해지면 다시 0으로 초기화해주어야 한다. 그렇지 않으면 sum값이 누적되버린다. 

 

[4] matrix 곱을 표현하려면 조건을 어떻게 주어야 할까?

A행렬의 원소가 {a11,a12,a13},{a21,a22,a23},{a31,a32,a33}

B행렬의 원소가 {b11,b12,b13},{b21,b22,b23},{b31,b32,b33} 라고 두면

A와 B행렬의 곱 AB의 원소는 {a11*b11+a12*b21+a13*b31, a11*b21+a12*b22+a13*b23, ...}이므로

각 원소 인덱스의 변화를 따라가면서 loop를 어떻게 만들지 생각한다.

 

[5] 행렬을 row by row로 출력해야 한다.

▶ row 1줄을 출력하고 나면 "\n"를 출력해주어 줄바꿈을 해준다.

 

#include <stdio.h>
const int n=3; --------------------------- [1]

int matrixMultiplication(int A[n][n], int B[n][n]){
    int i,j,k,sum = 0; ------------------- [3]
    int AB[n][n]; ------------------------ [2]
    for(i=0;i<n;i++){ -------------------- [4]
        for(j=0;j<n;j++){
            for(k=0;k<n;k++){
                sum = sum + A[i][k]*B[k][j];
                AB[i][j] = sum; ---------- [3]
            }
            sum = 0; --------------------- [3]
        }
    }
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d ", AB[i][j]);
        }
        printf("\n"); -------------------- [5]
    }
}

int main(){
    int A[3][3] = {1,2,3,4,5,6,7,8,9}; --- [2]
    int B[3][3] = {9,8,7,6,5,4,3,2,1}; --- [2]
    matrixMultiplication(A,B);
    return 0;
}

 


출력결과


Comments