fix hw3 some changes
This commit is contained in:
2
Makefile
2
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
|
||||
|
||||
167
hws/hw3/main.c
167
hws/hw3/main.c
@@ -1,62 +1,145 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <dlfcn.h>
|
||||
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 <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
|
||||
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;
|
||||
}
|
||||
67
hws/hw3/matutil.c
Normal file
67
hws/hw3/matutil.c
Normal file
@@ -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;
|
||||
}
|
||||
38
hws/hw3/matutil.h
Normal file
38
hws/hw3/matutil.h
Normal file
@@ -0,0 +1,38 @@
|
||||
#ifndef __MATUTIL_H__
|
||||
#define __MATUTIL_H__
|
||||
|
||||
#include <stdlib.h>
|
||||
#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
|
||||
Reference in New Issue
Block a user