🔓알고리즘/수학

행렬곱셈 이론및 실습 c++

Mawile 2021. 10. 9.
728x90

본 포스팅은 행렬곱셈(Matrix Multiplication)에 관한 이론및 c++기반의 실습내용을 포함하고 있습니다.

또한 개인적인 공부차원에서 작성한 글입니다.

 

참조및 도움

https://ko.wikipedia.org/wiki/%ED%96%89%EB%A0%AC_%EA%B3%B1%EC%85%88

 

행렬 곱셈 - 위키백과, 우리 모두의 백과사전

행렬 곱셈을 위해선 첫째 행렬의 열 갯수와 둘째 행렬의 행 갯수가 동일해야한다. 곱셈의 결과 새롭게 만들어진 행렬은 첫째 행렬의 행 갯수와 둘째 행렬의 열 갯수를 가진다. 행렬 곱셈(matrix mul

ko.wikipedia.org

http://mathurl.com/

 

mathURL

 

mathurl.com

 

행렬 곱셈이란?

두 개의 행렬에서 한 개의 행렬을 만들어내는 이항연산.

 

 

실제로 어떻게 계산될까?

 

 

또, 아래와 같은 식이 있다고 생각해보자.

이 행렬들의 곱셈은 어떠한 과정을 거쳐서 이러한 답이 나온것일까?

다음과 같다.

 

 

그리고, 자세히 보면..

결과값으로써 나오는 행렬의 세로길이는 첫번째행렬의 세로길이이며,

결과값으로써 나오는 행렬의 가로길이는 두번째행렬이 가로길이이다.

 

이제 이것을 바탕으로 행렬곱셈을 수행하는 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';
	}
}

 

 

이번에는 좀 정숙하게 포스팅했는데, 궁금한 부분있으면 댓글로 질문 부탁드립니다~!!

 


 

 

728x90

댓글