(자료구조)대학수업 Matrix Addition, Matrix Multiplication
문제
두 개의 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 계산하는 법을 알아야 풀 수 있다.
풀이 결과
Author And Source
이 문제에 관하여((자료구조)대학수업 Matrix Addition, Matrix Multiplication), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@k_gu_wae123/자료구조대학수업-Matrix-Addition-Matrix-Multiplication저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)