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