00001
00002 #ifndef __JBXL_MATRIX_LIBRARY_H_
00003 #define __JBXL_MATRIX_LIBRARY_H_
00004
00005
00013 #include "common.h"
00014 #include "mt.h"
00015
00016 #include <math.h>
00017 #include <float.h>
00018
00019
00020
00021 #ifndef va_start
00022 #include <stdarg.h>
00023 #endif
00024
00025
00026 typedef struct _ivector {
00027 int x;
00028 int y;
00029 int z;
00030 double n;
00031 } ivector;
00032
00033
00034 typedef struct _vector {
00035 double x;
00036 double y;
00037 double z;
00038 double n;
00039 } vector;
00040
00041
00042 typedef struct _quaternion {
00043 double s;
00044 double x;
00045 double y;
00046 double z;
00047 double n;
00048 } quaternion;
00049
00050
00051
00059 typedef struct _imatrix {
00060 int n;
00061 int r;
00062 int *sz;
00063 int *mx;
00064 } imatrix;
00065
00066
00074 typedef struct _matrix {
00075 int n;
00076 int r;
00077 int *sz;
00078 double *mx;
00079 } matrix;
00080
00081
00082 #define in_vector(a, b) ((a).x*(b).x+(a).y*(b).y+(a).z*(b).z)
00083 #define add_vector(a, b) set_vector((a).x+(b).x,(a).y+(b).y,(a).z+(b).z)
00084 #define sub_vector(a, b) set_vector((a).x-(b).x,(a).y-(b).y,(a).z-(b).z)
00085 #define add_ivector(a, b) set_ivector((a).x+(b).x,(a).y+(b).y,(a).z+(b).z)
00086 #define sub_ivector(a, b) set_ivector((a).x-(b).x,(a).y-(b).y,(a).z-(b).z)
00087 #define normal_vector(a) (a).r = sqrt((double)((a).x*(a).x)+(a).y*(a).y+(a).z*(a).z);
00088
00089
00090 #define Vt(m, i) ((m).mx[(i)-1])
00091 #define Mx(m, i, j) ((m).mx[(j)-1+(m).sz[1]*((i)-1)])
00092
00093 #define Mx1(m, i) ((m).mx[(i)-1])
00094 #define Mx2(m, i, j) ((m).mx[(j)-1+(m).sz[1]*((i)-1)])
00095 #define Mx3(m, i, j, k) ((m).mx[(k)-1+(m).sz[2]*((j)-1)+(m).sz[1]*(m).sz[2]*((i)-1)])
00096 #define Mx4(m, i, j, k, l) ((m).mx[(l)-1+(m).sz[3]*((k)-1)+(m).sz[2]*(m).sz[3]*((j)-1) +\
00097 (m).sz[1]*(m).sz[2]*(m).sz[3]*((i)-1)])
00098
00099
00100 vector unit_vector(vector a);
00101 vector unit_ivector(ivector a);
00102 vector set_vector(double x, double y, double z);
00103 ivector set_ivector(int x, int y, int z);
00104 vector ex_vector(vector a, vector b);
00105
00106 ivector f2ivector(vector a);
00107 vector i2vector(ivector a);
00108
00109 matrix make_matrix1(int n);
00110 matrix make_matrix2(int n, int m);
00111 matrix make_matrix (int n, int* sz);
00112
00113 imatrix make_imatrix1(int n);
00114 imatrix make_imatrix2(int n, int m);
00115 imatrix make_imatrix (int n, int* sz);
00116
00117
00118 double* get_matrix(matrix a, ...);
00119 matrix add_matrix(matrix a, matrix b);
00120 matrix sub_matrix(matrix a, matrix b);
00121 matrix mlt_matrix(matrix a, matrix b);
00122 void copy_matrix(matrix a, matrix b);
00123 void free_matrix(matrix* a);
00124 void clear_matrix(matrix* a);
00125 void print_matrix(FILE* fp, matrix a);
00126
00127 int* get_imatrix(imatrix a, ...);
00128 imatrix add_imatrix(imatrix a, imatrix b);
00129 imatrix sub_imatrix(imatrix a, imatrix b);
00130 imatrix mlt_imatrix(imatrix a, imatrix b);
00131 void copy_imatrix(imatrix a, imatrix b);
00132 void free_imatrix(imatrix* a);
00133 void clear_imatrix(imatrix* a);
00134 void print_imatrix(FILE* fp, imatrix a);
00135
00136
00137 matrix decompQR(matrix xx, imatrix col);
00138 matrix trans_matrix(matrix a);
00139 matrix minimum2(matrix a, matrix x);
00140 matrix invrU_matrix(matrix x);
00141
00142
00143 #endif