[R] 행렬곱 함수 직접 구현하기 (feat. For반복문)

해당 포스트에서는 R을 이용하여 행렬곱 함수를 직접 구현하고 내장 함수와의 결과값 비교를 통해 검증합니다.

1. INTRO

네이버 지식iN에서 지식을 공유하고 있습니다. 간단한 질문들은 해당 질문에 바로 답변을 드리지만 질문의 내용이 유익하거나 추가 설명이 필요한 경우에는 포스팅을 작성하여 공유드리고 있습니다.

2. 질문

▲ 네이버 지식인 질문

3. 풀이

기본적으로 R에서는 행렬곱을 위한 함수(%*%)를 제공하고 있습니다. 그러나 프로그래밍 관련 수업에서는 로직의 이해, 코딩 연습 등 역량 강화 목적으로 직접 구현하는 문제가 출제됩니다. 이번 질문도 해당 목적으로 문제를 받고 풀이에 어려움이 있으신 것으로 판단되어 도움이 되고자 풀이를 작성하였습니다.

  1. 데이터셋 생성
  2. 행렬곱 함수 구현
  3. 내장 함수 결과 검증

1. 데이터셋 생성

이번 행렬곱에 사용될 데이터는 질문에 올라온 매트릭스를 동일하게 구현하였습니다.

A <- matrix(c(2,3,4,3,2,1), nrow=2, byrow=T)
A
##      [,1] [,2] [,3]
## [1,]    2    3    4
## [2,]    3    2    1

B <- matrix(c(-2,4,2,3,-1,1,2,1,5), nrow=3, byrow=T)
B
##      [,1] [,2] [,3]
## [1,]   -2    4    2
## [2,]    3   -1    1
## [3,]    2    1    5

2. 행렬곱 함수 생성

행렬곱 함수(multiply)는 두 개의 매트릭스를 받아 for문으로 행렬곱을 수행하는 함수입니다. 입력 데이터인 mat1i * k 행렬, mat2k * j 행렬으로 연산되며 결과는 i * j 행렬res_mat에 저장됩니다.

multiply <- function(mat1, mat2){

  res_mat <- matrix(data = 0, nrow = nrow(mat1), ncol = ncol(mat2))

  for (i in 1:nrow(mat1)){

    for (j in 1:ncol(mat2)){

      for (k in 1:ncol(mat1)){

        res_mat[i,j] = res_mat[i,j] + mat1[i,k] * mat2[k,j]

      }
    } 
  }
  print(res_mat)
}

multiply(A, B)
##       [,1] [,2] [,3]
## [1,]   13    9   27
## [2,]    2   11   13

3. 내장 함수 결과 검증

R에서 제공하는 행렬곱(%*%) 함수를 이용하여 위에서 만든 함수의 결과를 검증해 보겠습니다.

A %*% B
##       [,1] [,2] [,3]
## [1,]   13    9   27
## [2,]    2   11   13

4. 마무리

이번 포스트에서는 R에서 제공하는 행렬곱 함수(%*%)를 사용하지 않고 직접 구현 하여 연산하는 방법을 소개드렸습니다. 위에서 제가 구현한 함수는 실제 행렬곱 함수 로직과 다를 수 있으며, 현업에서는 구현 방법에 따라 연산 성능의 차이가 많이 나기도 합니다. 이는 프로그래밍 실력을 판단하는 지표로도 사용되기에, 행렬곱 함수 외에도 다양한 내장 함수들을 직접 구현해보시면 앞으로의 공부에 많은 도움이 되실거라 생각합니다.

5. 관련 링크

[1] [C언어]3x2와 2x3의 두행렬에서 행렬의 곱을 구하는 프로그램 작성하기


banner-request-analysis