(자료구조)대학수업 Matrix Addition, Matrix Multiplication

김규회·2022년 3월 26일
0

문제

두 개의 matrix 를 파일 m1.txt, m2.txt 로 입력 받아, matrix addition 을 수행하는 프로그램을 작성하고, 그 결과를
화면에 출력하라. 입력 파일에 사용되는 matrix 들은 첫째줄에 row 와 column 개수, 둘째줄부터 row-major
order 로 원소들이 저장되어 있다. Matrix 는 malloc 을 이용하여 입력 파일에 주어진 row 개수ⅹcolumn 개수
크기의 2 차원 array 를 생성하여 사용한다.
*free 시키는 방법을 생각해 볼 것. 구현은 하지 않아도 됨.

Ex)
m1.txt
9 10
5 2 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 2 0 0 0 0 0 0 0 0

m2.txt
9 10
7 0 0 0 0 0 0 0 0 9
0 -1 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

(output)
9 10
12 2 0 0 0 0 0 0 0 9
0 0 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 2 0 0 0 0 0 0 0 0

풀이 코드

#include <stdio.h>
#include <stdlib.h>


int main() {
	int n, m, l; // n 세로줄 m 가로줄 l 배열 안의 값
	int i, j;
	int** x; //m1 txt 배열
	int** y; //m2 txt 배열
	int** z; //output txt 배열
	printf("컴퓨터학부 2019115615 김규회\n");
	FILE* fp = NULL;
	fopen_s(&fp, "m1.txt", "r");
	if (fp == NULL) {
		return 0;
	}



	fscanf_s(fp, "%d %d", &n, &m);




	x = (int**)malloc(sizeof(*x) * n);
	for (i = 0; i < n; i++) {
		x[i] = (int*)malloc(m * sizeof(**x));

	}

	for (int i = 0; i < n; i++) {


		for (j = 0; j < m; j++) {
			fscanf_s(fp, "%d", &l);
			x[i][j] = l;



		}

	}
	FILE* fp2 = NULL;
	fopen_s(&fp2, "m2.txt", "r");
	if (fp2 == NULL) {
		return 0;
	}
	fscanf_s(fp2, "%d %d", &n, &m);
	y = (int**)malloc(sizeof(*y) * n);
	for (i = 0; i < n; i++) {
		y[i] = (int*)malloc(m * sizeof(**y));

	}
	for (int i = 0; i < n; i++) {


		for (j = 0; j < m; j++) {
			fscanf_s(fp2, "%d", &l);
			y[i][j] = l;
		}
	}

	z = (int**)malloc(sizeof(*z) * n);
	for (i = 0; i < n; i++) {
		z[i] = (int*)malloc(m * sizeof(**z));

	}

	for (int i = 0; i < n; i++) {


		for (j = 0; j < m; j++) {
			z[i][j] = x[i][j] + y[i][j];


		}

	}

	printf("%d %d\n", n, m);
	for (int i = 0; i < n; i++) {


		for (j = 0; j < m; j++) {
			printf("%d ", z[i][j]);



		}
		printf("\n");
	}




	fclose(fp);
	fclose(fp2);
	return 0;
}

주의할 점 : 2차원 배열이므로 동적할당 할 때 **로 받기
그리고 flclose를 써주어야 메모리 낭비를 안함.

풀이결과

추가 문제

과제#05 와 같은 형식의 input file 에 대해 matrix multiplication 결과를 출력하라. 단, m1.txt 의
column 개수와 m2.txt 의 row 개수는 같다.
Ex)
m1.txt
5 2
1 1
2 0
0 0
0 0
0 1

m2.txt
2 3
1 1 1
0 0 2

(output)
5 3
1 1 3
2 2 2
0 0 0
0 0 0
0 0 2

풀이결과

#include <stdio.h>
#include <stdlib.h>

int main() {
	int n, m, l; // n 세로줄 m 가로줄 l 배열 안의 값
	int n2, m2; // n2 y 배열 받을 세로줄  m2 가로줄
	int i, j, k;
	int** x; 
	int** y;
	int** z;


	printf("컴퓨터학부 2019115615 김규회\n");
	FILE* fp = NULL;
	fopen_s(&fp, "m1.txt", "r");
	if (fp == NULL) {
		return 0;
	}


	fscanf_s(fp, "%d %d", &n, &m);

	x = (int**)malloc(sizeof(*x) * n);
	for (i = 0; i < n; i++) {
		x[i] = (int*)malloc(m * sizeof(**x));

	}

	for (int i = 0; i < n; i++) {


		for (j = 0; j < m; j++) {
			fscanf_s(fp, "%d", &l);
			x[i][j] = l;

		}

	}
	FILE* fp2 = NULL;
	fopen_s(&fp2, "m2.txt", "r");
	if (fp2 == NULL) {
		return 0;
	}


	fscanf_s(fp2, "%d %d", &n2, &m2);
	y = (int**)malloc(sizeof(*y) * n2);
	for (i = 0; i < n2; i++) {
		y[i] = (int*)malloc(m2 * sizeof(**y));

	}
	for (int i = 0; i < n2; i++) {


		for (j = 0; j < m2; j++) {
			fscanf_s(fp2, "%d", &l);
			y[i][j] = l;

		}

	}
	z = (int**)malloc(sizeof(*z) * n);
	for (i = 0; i < n; i++) {
		z[i] = (int*)malloc(m2 * sizeof(**z));

	}


	for (i = 0; i < n; i++) {
		for (j = 0; j < m2; j++) {
			z[i][j] = 0;
			for (k = 0; k < m; k++) {
				z[i][j] = z[i][j] + (x[i][k] * y[k][j]);
			}

		}



	}

	printf("%d %d\n", n, m2);
	for (i = 0; i < n; i++) {
		for (j = 0; j < m2; j++) {
			printf("%d ", z[i][j]);
		}

		printf("\n");
	}

	fclose(fp);
	fclose(fp2);
	return 0;
}

주의해야 할 점 : matrix multiplication 계산하는 법을 알아야 풀 수 있다.

풀이 결과

profile
프론트엔드 Developer

0개의 댓글