Files
2025-02-Numerical/hws/hw3/matutil.c

172 lines
3.6 KiB
C

#include "matutil.h"
#define FLOAT_FORMAT "%10.7f "
void print_vector_float(int size, float *v) {
int 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 = 1; i <= size; i++) {
printf("%d ", v[i]);
}
printf("\n");
}
float **new_matrix(int m, int 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) {
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(FLOAT_FORMAT, 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];
}
}
}
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) {
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;
}