fix final main.c matutil.c matutil.h and add hw3.txt and README.md

This commit is contained in:
2025-10-13 23:26:27 +09:00
parent e1762a9809
commit 18139848ed
5 changed files with 667 additions and 32 deletions

View File

@@ -1,23 +1,42 @@
#include "matutil.h"
#define FLOAT_FORMAT "%10.7f "
void print_vector_float(int size, float *v) {
int i;
for (i = 0; i < size; i++) {
printf("%6.2f ", v[i]);
for (i = 1; i <= size; i++) {
printf(FLOAT_FORMAT, v[i]);
}
printf("\n");
}
void print_vector_int(int size, int *v) {
int i;
for (i = 0; i < size; i++) {
for (i = 1; i <= size; i++) {
printf("%d ", v[i]);
}
printf("\n");
}
float **new_matrix(int m, int n) {
return matrix(1, m, 1, n);
float **mat = matrix(1, m, 1, n);
int i, j;
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++) {
mat[i][j] = 0;
}
}
return mat;
}
float **new_diagonal(int n, float *v) {
float **mat = new_matrix(n, n);
int i;
for (i = 1; i <= n; i++) {
mat[i][i] = v[i];
}
return mat;
}
void simple_free_matrix(int m, int n, float **mat) {
@@ -28,7 +47,7 @@ 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(FLOAT_FORMAT, mat[i][j]);
}
printf("\n");
}
@@ -43,6 +62,92 @@ void copy_matrix(int m, int n, float **src, float **dst) {
}
}
float **matmul(int m, int n, int p, float **a, float **b) {
float **c = new_matrix(m, p);
int i, j, k;
for (i = 1; i <= m; i++) {
for (j = 1; j <= p; j++) {
c[i][j] = 0;
for (k = 1; k <= n; k++) {
c[i][j] += a[i][k] * b[k][j];
}
}
}
return c;
}
float **mattranspose(int m, int n, float **mat) {
float **t = new_matrix(n, m);
int i, j;
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++) {
t[j][i] = mat[i][j];
}
}
return t;
}
float **matinv(int m, float **mat) {
float **inv = new_matrix(m, m);
int i, j;
for (i = 1; i <= m; i++) {
for (j = 1; j <= m; j++) {
if (i == j) {
inv[i][j] = 1;
} else {
inv[i][j] = 0;
}
}
}
gaussj(mat, m, inv, m);
return inv;
}
void create_submatrix(float **matrix, float **sub_matrix, int n, int exclude_col) {
int sub_i = 1;
int i, j;
for (i = 2; i <= n; i++) {
int sub_j = 1;
for (j = 1; j <= n; j++) {
if (j == exclude_col) {
continue;
}
sub_matrix[sub_i][sub_j] = matrix[i][j];
sub_j++;
}
sub_i++;
}
}
float matdet(int m, float **mat) {
if (m == 1) {
return mat[1][1];
} else if (m == 2) {
return mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1];
}
float det = .0f;
float **submat = new_matrix(m - 1, m - 1);
int i, j;
for(i = 1; i <= m; i ++) {
create_submatrix(mat, submat, m, i);
float sign = (i % 2 == 0) ? -1 : 1;
float el = mat[1][i];
det += el * sign * matdet(m-1, submat);
}
simple_free_matrix(m - 1, m - 1, submat);
return det;
}
/* for JMatrixData */
void copy_jmatdata(JMatrixData *src, JMatrixData *dst) {