From e1762a98092bb2bd0ebc1f23eb6b48e3a0dcf70d Mon Sep 17 00:00:00 2001 From: yenru0 Date: Mon, 13 Oct 2025 16:46:01 +0900 Subject: [PATCH] fix hw3 some changes --- Makefile | 2 +- hws/hw3/main.c | 169 ++++++++++++++++++++++++++++++++++------------ hws/hw3/matutil.c | 67 ++++++++++++++++++ hws/hw3/matutil.h | 38 +++++++++++ 4 files changed, 232 insertions(+), 44 deletions(-) create mode 100644 hws/hw3/matutil.c create mode 100644 hws/hw3/matutil.h diff --git a/Makefile b/Makefile index 88be8b3..1f9f4c5 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ BUILD_DIR := ./build CC := gcc -CFLAGS := -Wall -g -std=c90 +CFLAGS := -Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable -Wall -g -std=c90 LDFLAGS := -lm LIB_DIR := ./lib/nr/ansi diff --git a/hws/hw3/main.c b/hws/hw3/main.c index 3a5f456..4bff324 100644 --- a/hws/hw3/main.c +++ b/hws/hw3/main.c @@ -1,62 +1,145 @@ -#include -#include -#include -void exit(int status) { - static void (*real_exit)(int) = 0; - if (!real_exit) { - real_exit = dlsym(RTLD_NEXT, "exit"); - } - printf("HI"); -} - #include "nr.h" #include "nrutil.h" +#include #include #include -#include +#include -void print_matrix(int m, int n, float **mat) { - int i, j; - for(i = 1; i <= m; i ++) { - for(j = 1; j <= n; j ++) { - printf("%6.2f ", mat[i][j]); - } - printf("\n"); +#include "matutil.h" + +void try_gaussj(JMatrixData* data) { + printf("gauss-jordan method:\n"); + gaussj(data->a, data->m, data->b, 1); + print_matrix(data->m, 1, data->b); +} + +void try_lu(JMatrixData* data) { + printf("LU Decomposition:\n"); + + int* indx = calloc(data->m + 1, sizeof(int)); + float* d = calloc(data->m + 1, sizeof(float)); + ludcmp(data->a, data->m, indx, d); + + print_matrix(data->m, data->n, data->a); + + printf("index: "); + print_vector_int(data->m, indx); + printf("d: "); + print_vector_float(data->m, d); + + printf("solution:\n"); + float * b = calloc(data->m + 1, sizeof(float)); + int i; + for (i = 1; i <= data->m; i++) { + b[i] = data->b[i][1]; } + lubksb(data->a, data->m, indx, b); + for (i = 1; i <= data->m; i++) { + printf("%6.2f ", b[i]); + } + free(indx); + free(d); + +} + +void processMatrix(JMatrixData* data) { + printf("-----------------------------\n"); + printf("matrix data A:\n"); + print_matrix(data->m, data->n, data->a); + printf("matrix data b:\n"); + print_matrix(data->m, 1, data->b); + printf("-----------------------------\n"); + + pid_t pid = fork(); + if (pid < 0) { + printf("process 실행 실패\n"); + return; + } else if (pid == 0) { + printf("created process for gauss-jordan method\n"); + printf("-----------------------------\n"); + JMatrixData* copied = new_jmatdata(data->m, data->n); + copy_jmatdata(data, copied); + try_gaussj(copied); + free_jmatdata(copied); + printf("-----------------------------\n"); + exit(0); + } + + wait(NULL); + pid = fork(); + if (pid < 0) { + printf("process 실행 실패\n"); + return; + } else if (pid == 0) { + printf("created process for LU Decomposition\n"); + printf("-----------------------------\n"); + JMatrixData* copied = new_jmatdata(data->m, data->n); + copy_jmatdata(data, copied); + try_lu(copied); + free_jmatdata(copied); + printf("-----------------------------\n"); + exit(0); + + } + wait(NULL); +} + +JMatrixData*readDataFrom(char *filename) { + FILE *fp = fopen(filename, "r"); + + if (fp == NULL) { + printf("Error opening file"); + exit(1); + } + + int m, n; + fscanf(fp, "%d", &m); + fscanf(fp, "%d", &n); + + JMatrixData*data = new_jmatdata(m, n); + + int i, j; + for (i = 1; i <= data->m; i++) { + for (j = 1; j <= data->n; j++) { + fscanf(fp, "%f", &data->a[i][j]); + } + } + + for (i = 1; i <= data->m; i++) { + fscanf(fp, "%f", &data->b[i][1]); + } + + fclose(fp); + return data; } int main() { int m, n; int i, j; - FILE *fp = fopen("lineq1.dat", "r"); - if(fp == NULL) { - printf("Error opening file"); - exit(1); - } - - fscanf(fp, "%d", &m); /* row */ - fscanf(fp, "%d", &n); /* col */ - - float** a = matrix(1, m, 1, n); - for(i = 1;i <= m; i ++) { - for(j = 1;j <= n; j ++) { - fscanf(fp, "%f", &a[i][j]); + const char *filenames[] = { + "lineq1.dat", "lineq2.dat", "lineq3.dat"}; + pid_t pid; + for (i = 0; i < 3; i++) { + pid = fork(); + if (pid < 0) { + printf("process 실행 실패\n"); + return 2; + } else if (pid == 0) { + printf("=================================\n"); + printf("data from %s:\n", filenames[i]); + JMatrixData* data = readDataFrom(filenames[i]); + processMatrix(data); + printf("end for %s\n", filenames[i]); + exit(0); } - } - float **b = matrix(1, m, 1, 1); - for(i = 1; i<= m; i++) { - fscanf(fp, "%f", &b[i][1]); + wait(NULL); } - fclose(fp); - print_matrix(m, n, a); - print_matrix(m, 1, b); - gaussj(a, n, b, m); - print_matrix(m, n, a); - print_matrix(m, 1, b); - + + + printf("end\n"); return 0; } \ No newline at end of file diff --git a/hws/hw3/matutil.c b/hws/hw3/matutil.c new file mode 100644 index 0000000..9480e79 --- /dev/null +++ b/hws/hw3/matutil.c @@ -0,0 +1,67 @@ +#include "matutil.h" + +void print_vector_float(int size, float *v) { + int i; + for (i = 0; i < size; i++) { + printf("%6.2f ", v[i]); + } + printf("\n"); +} + +void print_vector_int(int size, int *v) { + int i; + for (i = 0; i < size; i++) { + printf("%d ", v[i]); + } + printf("\n"); +} + +float **new_matrix(int m, int n) { + return matrix(1, m, 1, n); +} + +void simple_free_matrix(int m, int n, float **mat) { + free_matrix(mat, 1, m, 1, n); +} + +void print_matrix(int m, int n, float **mat) { + int i, j; + for (i = 1; i <= m; i++) { + for (j = 1; j <= n; j++) { + printf("%6.2f ", mat[i][j]); + } + printf("\n"); + } +} + +void copy_matrix(int m, int n, float **src, float **dst) { + int i, j; + for (i = 1; i <= m; i++) { + for (j = 1; j <= n; j++) { + dst[i][j] = src[i][j]; + } + } +} + +/* for JMatrixData */ + +void copy_jmatdata(JMatrixData *src, JMatrixData *dst) { + dst->m = src->m; + dst->n = src->n; + copy_matrix(src->m, src->n, src->a, dst->a); + copy_matrix(src->m, 1, src->b, dst->b); +} + +void free_jmatdata(JMatrixData *data) { + simple_free_matrix(data->m, data->n, data->a); + simple_free_matrix(data->m, 1, data->b); +} + +JMatrixData *new_jmatdata(int m, int n) { + JMatrixData *data = malloc(sizeof(JMatrixData)); + data->m = m; + data->n = n; + data->a = new_matrix(data->m, data->n); + data->b = new_matrix(data->m, 1); + return data; +} \ No newline at end of file diff --git a/hws/hw3/matutil.h b/hws/hw3/matutil.h new file mode 100644 index 0000000..1fde058 --- /dev/null +++ b/hws/hw3/matutil.h @@ -0,0 +1,38 @@ +#ifndef __MATUTIL_H__ +#define __MATUTIL_H__ + +#include +#include "nr.h" +#include "nrutil.h" + + +void print_vector_float(int size, float* v); + +void print_vector_int(int size, int* v); + + + +float **new_matrix(int m, int n); + +void print_matrix(int m, int n, float **mat); + +void copy_matrix(int m, int n, float **src, float **dst); + +void simple_free_matrix(int m, int n, float **mat); + +/** + * a struct for get solution of ax = b + */ +typedef struct JMatrixData { + int m, n; + float **a; + float **b; +} JMatrixData; + +JMatrixData* new_jmatdata(int m, int n); + +void free_jmatdata(JMatrixData* data); + +void copy_jmatdata(JMatrixData *src, JMatrixData *dst); + +#endif \ No newline at end of file