172 lines
3.6 KiB
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;
|
|
} |