오늘은 행렬의 곱을 실습을 해보도록 하죠.
3x3 행렬의 곱을 하기 위해서는 우선 수학식을 알아야 겠죠.
위 그림과 같이 결과 행렬의 위치 A에 값을 구하기 위해서는 두 행렬의 곱을 할 때는 앞에 행렬의 행과 뒤의 행렬의 열을 곱해서 행렬 A 위치의 값을 구하게 됩니다. 즉, 행과 열의 곱으로 해서 하나의 행렬 위치의 값을 구한다고 생각하시면 됩니다.
색이 칠해진 위치를 수식으로 하면 아래와 같습니다.
C[0][0] = A[0][0]*B[0][0]+A[0][1]*B[1][0]+A[0][2]*B[2][0];
위 식을 보면 규칙성을 보이실 거에요.
for(int k=0;k<3;k++){
C[0][0] += A[0][k]*B[k][0];
}
이렇게 A행렬의 행과 B행렬의 열의 위치를 0~2까지 총 3개의 데이터를 곱한 걸 전부 더해서 C[0][0]의 값을 구하게 됩니다.
그리고, 행렬를 표현 할 때는 예전에 설명했지만 다시 설명드리면 무조건 행렬은 for문으로 구현합니다. 2차 행렬은 바로 아래와 같이 2개의 for문으로 구현합니다.
for(int i=0;i<행수;i++){
for(int j=0;j<열수;ㅓ++){
}
}
위 코딩이 머리속에서 바로 떠올라야 합니다. 나중에 3차 공간 행렬을 쓸때는 x,y,z식으로 변수를 선언하고 3차 for문으로 해서 위 2차 for문에 한개 for문을 더 추가하면 간단히 표현 할 수 있습니다.
이제 3x3 행렬의 곱을 실제 해봅시다.
[전체소스]
#include
using namespace std;
int main(int argc, char** argv) {
int A[3][3] = {{1,1,1},
{2,2,2},
{3,3,3}};
int B[3][3] = {{1,2,3},
{1,2,3},
{1,2,3}};
int C[3][3] = {0};
//3X3 행렬곱
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
for(int k=0;k<3;k++){
C[i][j]+=A[i][k]*B[k][j];
}
}
}
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
cout<<C[i][j];
if(j<2) cout<<" ";
}
cout<<endl;
}
return 0;
}
[결과]
C언어 실습에서 행렬의 대한 부분을 코딩한 것 같은데 갑자기 기억이 잘 안나네요. 중복 post가 된 것이 아닌지 모르겠네요. 아무튼 행렬의 곱을 C++ 상에서 간단히 실습을 해보았네요.