1 /* Double-precision two-dimensional matrices, and some linear algebra 2 * 3 * SRE, Tue Jul 13 14:41:07 2004 [St. Louis] 4 */ 5 #ifndef eslDMATRIX_INCLUDED 6 #define eslDMATRIX_INCLUDED 7 #include "esl_config.h" 8 9 #include <stdio.h> 10 11 typedef struct { 12 /*mx, mx[0] are allocated. */ 13 /*::cexcerpt::dmatrix_obj::begin::*/ 14 double **mx; /* mx[i][j] is i'th row, j'th col */ 15 int n; /* rows */ 16 int m; /* columns */ 17 enum { eslGENERAL, eslUPPER } type; 18 /*::cexcerpt::dmatrix_obj::end::*/ 19 int ncells; /* number of valid cells (nxm in standard matrix) */ 20 } ESL_DMATRIX; 21 22 typedef struct { 23 int *pi; 24 int n; 25 } ESL_PERMUTATION; 26 27 /* 1. The ESL_DMATRIX object. */ 28 extern ESL_DMATRIX *esl_dmatrix_Create(int n, int m); 29 extern ESL_DMATRIX *esl_dmatrix_CreateUpper(int n); 30 extern int esl_dmatrix_Destroy(ESL_DMATRIX *A); 31 extern int esl_dmatrix_Copy (const ESL_DMATRIX *src, ESL_DMATRIX *dest); 32 extern ESL_DMATRIX *esl_dmatrix_Clone (const ESL_DMATRIX *old); 33 extern int esl_dmatrix_Compare (const ESL_DMATRIX *A, const ESL_DMATRIX *B, double tol); 34 extern int esl_dmatrix_CompareAbs (const ESL_DMATRIX *A, const ESL_DMATRIX *B, double tol); 35 extern int esl_dmatrix_Set (ESL_DMATRIX *A, double x); 36 extern int esl_dmatrix_SetZero (ESL_DMATRIX *A); 37 extern int esl_dmatrix_SetIdentity(ESL_DMATRIX *A); 38 39 /* 2. Debugging/validation for ESL_DMATRIX. */ 40 extern int esl_dmatrix_Dump(FILE *ofp, const ESL_DMATRIX *A, 41 const char *rowlabel, const char *collabel); 42 43 /* 3. Visualization tools. */ 44 extern int esl_dmatrix_PlotHeatMap(FILE *fp, ESL_DMATRIX *D, double min, double max); 45 46 /* 4. The ESL_PERMUTATION object. */ 47 extern ESL_PERMUTATION *esl_permutation_Create(int n); 48 extern int esl_permutation_Destroy(ESL_PERMUTATION *P); 49 extern int esl_permutation_Reuse(ESL_PERMUTATION *P); 50 51 /* 5. Debugging/validation for ESL_PERMUTATION. */ 52 extern int esl_permutation_Dump(FILE *ofp, const ESL_PERMUTATION *P, 53 const char *rowlabel, const char *collabel); 54 55 /* 6. The rest of the dmatrix API. */ 56 extern double esl_dmx_Max (const ESL_DMATRIX *A); 57 extern double esl_dmx_Min (const ESL_DMATRIX *A); 58 extern double esl_dmx_Sum (const ESL_DMATRIX *A); 59 extern int esl_dmx_MinMax(const ESL_DMATRIX *A, double *ret_min, double *ret_max); 60 extern int esl_dmx_FrobeniusNorm(const ESL_DMATRIX *A, double *ret_fnorm); 61 extern int esl_dmx_Multiply(const ESL_DMATRIX *A, const ESL_DMATRIX *B, ESL_DMATRIX *C); 62 extern int esl_dmx_Exp(const ESL_DMATRIX *Q, double t, ESL_DMATRIX *P); 63 extern int esl_dmx_Transpose(ESL_DMATRIX *A); 64 extern int esl_dmx_Add(ESL_DMATRIX *A, const ESL_DMATRIX *B); 65 extern int esl_dmx_Scale(ESL_DMATRIX *A, double k); 66 extern int esl_dmx_AddScale(ESL_DMATRIX *A, double k, const ESL_DMATRIX *B); 67 extern int esl_dmx_Permute_PA(const ESL_PERMUTATION *P, const ESL_DMATRIX *A, ESL_DMATRIX *B); 68 extern int esl_dmx_LUP_decompose(ESL_DMATRIX *A, ESL_PERMUTATION *P); 69 extern int esl_dmx_LU_separate(const ESL_DMATRIX *LU, ESL_DMATRIX *L, ESL_DMATRIX *U); 70 extern int esl_dmx_Invert(const ESL_DMATRIX *A, ESL_DMATRIX *Ai); 71 72 /* 7. Optional: interoperability with GSL */ 73 #ifdef HAVE_LIBGSL 74 #include <gsl/gsl_matrix.h> 75 extern int esl_dmx_MorphGSL(const ESL_DMATRIX *E, gsl_matrix **ret_G); 76 extern int esl_dmx_UnmorphGSL(const gsl_matrix *G, ESL_DMATRIX **ret_E); 77 #endif 78 79 /* 8. Optional: interfaces to LAPACK */ 80 #ifdef HAVE_LIBLAPACK 81 extern int esl_dmx_Diagonalize(const ESL_DMATRIX *A, double **ret_Er, double **ret_Ei, ESL_DMATRIX **ret_UL, ESL_DMATRIX **ret_UR); 82 #endif 83 84 #endif /*eslDMATRIX_INCLUDED*/ 85