🔓알고리즘/수학
행렬곱셈 이론및 실습 c++
본 포스팅은 행렬곱셈(Matrix Multiplication)에 관한 이론및 c++기반의 실습내용을 포함하고 있습니다.
또한 개인적인 공부차원에서 작성한 글입니다.
참조및 도움
https://ko.wikipedia.org/wiki/%ED%96%89%EB%A0%AC_%EA%B3%B1%EC%85%88
행렬 곱셈이란?
두 개의 행렬에서 한 개의 행렬을 만들어내는 이항연산.
실제로 어떻게 계산될까?
또, 아래와 같은 식이 있다고 생각해보자.
이 행렬들의 곱셈은 어떠한 과정을 거쳐서 이러한 답이 나온것일까?
다음과 같다.
그리고, 자세히 보면..
결과값으로써 나오는 행렬의 세로길이는 첫번째행렬의 세로길이이며,
결과값으로써 나오는 행렬의 가로길이는 두번째행렬이 가로길이이다.
이제 이것을 바탕으로 행렬곱셈을 수행하는 c++기반의 함수를 만들어보았다.
배열의 원소가 정수형, 실수형 모두 사용될 상황을 대비하여,
행렬곱셈을 수행하는 matmul함수는 템플릿으로 감싸줬다. (코드에서는 실수형배열을 사용했다.)
개인적으로 행렬곱셈을 보고있으면, 플로이드-와샬 알고리즘이 떠오른다.
#include <iostream>
#include <vector>
using ArrayType = double;
/**
@param (첫번째행렬, 세로길이1, 가로길이1, 두번째행렬, 세로길이2, 가로길이2)
*/
template<typename vecType>
std::vector<std::vector<vecType>> matmul(
std::vector<std::vector<vecType>>& arr1, int row1, int col1,
std::vector<std::vector<vecType>>& arr2, int row2, int col2){
std::vector<std::vector<vecType>> result(row1, std::vector<vecType>(col2));
for(int i=0;i<row1;++i){
for(int j=0;j<col2;++j){
vecType sum = 0.0;
for(int k=0;k<row2;++k) sum += arr1[i][k] * arr2[k][j];
result[i][j] = sum;
}
}
return result;
}
int main() {
const int ROW_1 = 2;
const int COL_1 = 3;
const int ROW_2 = 3;
const int COL_2 = 2;
std::vector<std::vector<ArrayType>> arr1 =
{
{ 1, 1, 3 },
{ 3, 2, 1 },
};
std::vector<std::vector<ArrayType>> arr2 =
{
{ 1, 2 },
{ 1, 1 },
{ 1, 3 },
};
auto result = matmul<ArrayType>(arr1, ROW_1, COL_1, arr2, ROW_2, COL_2);
for(int i=0;i<ROW_1;++i){
for(int j=0;j<COL_2;++j){
std::cout << result[i][j] << ' ';
}
std::cout << '\n';
}
}
이번에는 좀 정숙하게 포스팅했는데, 궁금한 부분있으면 댓글로 질문 부탁드립니다~!!
'🔓알고리즘 > 수학' 카테고리의 다른 글
1부터 n사이의 홀수의 합을 O(1)로 구하는 방법 ( C++ 최적화 기법 ) (0) | 2022.01.22 |
---|---|
Softmax function 구현하기 C++ (0) | 2021.10.11 |
삼각형 내부에 존재하는지 점인지 확인하는법 c++ (0) | 2021.08.20 |
제곱, 제곱근 구현하기 (0) | 2021.08.13 |
나눗셈 연산속도 최적화 C++ (0) | 2021.08.02 |
댓글