00001
00002
00003
00004
00005
00023
00024
00025
00026
00027
00028
00029 #ifndef AR_MATRIX_H
00030 #define AR_MATRIX_H
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034
00035
00036
00037
00038
00039 #include <math.h>
00040 #include <AR/config.h>
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00073 typedef struct {
00074 double *m;
00075 int row;
00076 int clm;
00077 } ARMat;
00078
00089 typedef struct {
00090 double *v;
00091 int clm;
00092 } ARVec;
00093
00099
00100 #define ARELEM0(mat,r,c) ((mat)->m[(r)*((mat)->clm)+(c)])
00101
00107
00108 #define ARELEM1(mat,row,clm) ARELEM0(mat,row-1,clm-1)
00109
00110
00111
00112
00113
00114
00115
00116
00117
00127 ARMat *arMatrixAlloc(int row, int clm);
00128
00136 int arMatrixFree(ARMat *m);
00137
00147 int arMatrixDup(ARMat *dest, ARMat *source);
00148
00156 ARMat *arMatrixAllocDup(ARMat *source);
00157
00167 int arMatrixUnit(ARMat *unit);
00168
00177 ARMat *arMatrixAllocUnit(int dim);
00178
00191 int arMatrixMul(ARMat *dest, ARMat *a, ARMat *b);
00192
00204 ARMat *arMatrixAllocMul(ARMat *a, ARMat *b);
00205
00215 int arMatrixTrans(ARMat *dest, ARMat *source);
00216
00225 ARMat *arMatrixAllocTrans(ARMat *source);
00226
00238 int arMatrixInv(ARMat *dest, ARMat *source);
00239
00248 int arMatrixSelfInv(ARMat *m);
00249
00258 ARMat *arMatrixAllocInv(ARMat *source);
00259
00267 double arMatrixDet(ARMat *m);
00268
00279 int arMatrixPCA( ARMat *input, ARMat *evec, ARVec *ev, ARVec *mean );
00280
00290 int arMatrixPCA2( ARMat *input, ARMat *evec, ARVec *ev );
00291
00300 int arMatrixDisp(ARMat *m);
00301
00309 ARVec *arVecAlloc( int clm );
00310
00318 int arVecFree( ARVec *v );
00319
00327 int arVecDisp( ARVec *v );
00328
00336 double arVecHousehold( ARVec *x );
00337
00347 double arVecInnerproduct( ARVec *x, ARVec *y );
00348
00358 int arVecTridiagonalize( ARMat *a, ARVec *d, ARVec *e );
00359
00360
00361 #ifdef __cplusplus
00362 }
00363 #endif
00364 #endif
00365