이번달 융과탐 주제로 행렬을 계산해주는 행렬 계산기를 만들기로 결정했습니다.
제가 만든 행렬 계산기는 합차 계산, 상수배, 행렬 곱 이렇게 3가지 기능이 있는데요 먼저 행렬의 연산에 대한 기본적인 정의를 알려드리겠습니다.
행렬은 가로, 세로 성분으로 이루어진 집합인데요 먼저 행렬의 합차 연산은 각 성분별로 계산해주면 됩니다. 이 때 중요한점은 연산하고자 하는 두 행렬의 행과 열의 크기가 같아야 한다는 점 입니다.
행렬의 상수배는 행렬의 각 성분에 상수를 곱해주면 됩니다.
이처럼 행렬은 기존에 하던 연산과 크게 다르지 않다고 느낄 수 있지만 행렬의 곱은 기존의 연산과 좀 다릅니다.
행렬은 일단 곱셈에 대한 교환법칙이 성립하지 않습니다. 두 행렬간의 곱을 정의하자면 다음과 같습니다.
이렇듯 행렬의 곱셈은 기존에 알던 곱과 조금 다르게 연산됩니다.
아래의 코드는 행렬 계산기를 구현한 저의 코드입니다.
#include <stdio.h> //헤더파일 선언
int main() //메인함수 생성
{
printf("행렬 계산기\n"); //소개
printf("1: 행렬합\n2: 행렬 상수배\n3: 행렬 곱\n선택: "); //사용목적 선택
int i,m,n,k,p,q; //int형 변수 선언
int a[100][100],b[100][100],c[100][100]; //행렬 생성
scanf("%d",&i); //사용목적 입력
if(i==1){ //행렬합
printf("p*A+q*B의 값 도출 (p,q는 스칼라, A,B는 행렬)\n"); //출력 값 설명
printf("p,q를 입력해주세요\n"); //계수 입력 설명
scanf("%d %d",&p,&q); //계수 입력
printf("행렬 A,B의 크기를 입력해 주세요\n크기: "); //행렬 크기 입력 설명
scanf("%d %d",&m,&n); //행렬 크기 입력
printf("A\n"); //행렬 A라고 설명
for(int i=0; i<m; i++){ //행
for(int j=0; j<n; j++){ //열
scanf("%d",&a[i][j]); //행렬 A 입력
}
}
printf("B\n"); //행렬 B라고 설명
for(int i=0; i<m; i++){ //행
for(int j=0; j<n; j++){ //열
scanf("%d",&b[i][j]); //행렬 B 입력
}
}
printf("p*A+q*B의 값\n"); //결과 출력 안내
for(int i=0; i<m; i++){ //행
printf("| "); //왼쪽 괄호
for(int j=0; j<n; j++){ //열
printf("%d ",p*a[i][j]+q*b[i][j]); //결과값 출력
}
printf("|"); //오른쪽 괄호
printf("\n"); //행 구분
}
}
else if(i==2){ //행렬 상수배
printf("p*A의 값 도출 (p는 스칼라, A는 행렬)\n"); //출력 값 설명
printf("p를 입력해주세요\n"); //상수 입력 안내
scanf("%d",&p); //상수 입력
printf("행렬 A의 크기를 입력해 주세요\n크기: "); //행렬 A크기 입력 설명
scanf("%d %d",&m,&n); //행렬 A크기 입력
printf("A\n"); //행렬 A라고 설명
for(int i=0; i<m; i++){ //행
for(int j=0; j<n; j++){ //열
scanf("%d",&a[i][j]); //행렬 입력
}
}
printf("p*A의 값\n"); //결과 출력 안내
for(int i=0; i<m; i++){ //행
printf("| "); //왼쪽 괄호
for(int j=0; j<n; j++){ //열
printf("%d ",p*a[i][j]); //결과 출력
}
printf("|"); //오른쪽 괄호
printf("\n"); //행 구분
}
}
else if(i==3){ //행렬 곱
printf("A*B의 값 도출 (A,B는 행렬)\n"); //결과 출력 안내
printf("행렬 A,B의 크기를 입력해 주세요\n크기: "); //행렬 크기 입력 안내
printf("A의 크기: m*n\n"); //A 크기 안내
scanf("%d %d",&m,&n); //크기 입력
printf("B의 크기: n*k\n"); //B 크기 안내
scanf("%d %d",&n,&k); //크기 입력
printf("A\n"); //행렬 A라고 설명
for(int i=0; i<m; i++){ //행
for(int j=0; j<n; j++){ //열
scanf("%d",&a[i][j]); //행렬 성분 입력
}
}
printf("B\n"); //행렬 B라고 설명
for(int i=0; i<n; i++){ //행
for(int j=0; j<k; j++){ //열
scanf("%d",&b[i][j]); //행렬 성분 입력
}
}
for(int i=0; i<m; i++){ //행
for(int j=0; j<k; j++){ //열
for(int o=0; o<n; o++){ //성분 합 횟수
c[i][j]=c[i][j]+a[i][o]*b[o][j]; //성분에 곱의 정의에 따라 나온 값
}
}
}
printf("A*B의 값\n"); //출력 값 설명
for(int i=0; i<m; i++){ //행
printf("| "); //왼쪽 괄호
for(int j=0; j<k; j++){ //열
printf("%d ",c[i][j]); //값 출력
}
printf("|"); //오른쪽 괄호
printf("\n"); //행 구분
}
}
}
다음 코드는 c언어로 만들었습니다. 원하는 연산을 선택하고 행렬, 상수 등을 입력해주면 연산의 결과가 출력됩니다.
이상으로 3월 정보융합탐구 과제를 마치겠습니다.