상세 컨텐츠

본문 제목

행렬 계산기

카테고리 없음

by yadtoo 2023. 3. 29. 15:28

본문

이번달 융과탐 주제로 행렬을 계산해주는 행렬 계산기를 만들기로 결정했습니다.

제가 만든 행렬 계산기는 합차 계산, 상수배, 행렬 곱 이렇게 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월 정보융합탐구 과제를 마치겠습니다.