fix final main.c matutil.c matutil.h and add hw3.txt and README.md
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user