1 #ifndef _AFNI_RCMAT_HEADER_
2 #define _AFNI_RCMAT_HEADER_
3 
4 /*****
5   Struct to hold a banded square matrix that is either symmetric,
6   or upper or lower triangular (depending on the needs of the moment).
7 *****/
8 
9 #undef  LENTYP
10 #define LENTYP unsigned short
11 
12 #undef  LENTYP_MAX
13 #define LENTYP_MAX 65535u
14 
15 typedef struct {
16   int     nrc ;    /* # of rows and columns */
17   LENTYP *len ;    /* in row/column #i, there are len[i] elements */
18   double **rc ;    /* so the first column/row index is i+1-len[i] */
19                    /* diagonal element #i is in rc[i][len[i]-1]   */
20 } rcmat ;
21 
22 #define ISVALID_RCMAT(rr)                                      \
23   ( (rr) != NULL && (rr)->len != NULL && (rr)->len[0] == 1 &&  \
24                     (rr)->rc  != NULL && (rr)->rc[0]  != NULL )
25 
26 extern rcmat * rcmat_init         ( int n ) ;
27 extern void    rcmat_destroy      ( rcmat *rcm ) ;
28 extern rcmat * rcmat_copy         ( rcmat *rcm ) ;
29 extern int     rcmat_choleski     ( rcmat *rcm ) ;
30 extern void    rcmat_lowert_solve ( rcmat *rcm , double *vec ) ;
31 extern void    rcmat_uppert_solve ( rcmat *rcm , double *vec ) ;
32 extern void    rcmat_lowert_vecmul( rcmat *rcm , double *vec ) ; /* 02 Oct 2009 */
33 
34 extern void    rcmat_lowert_solve_unrolled( rcmat *rcm , double *vec ) ;
35 extern float   rcmat_avglen( rcmat *rcm ) ;
36 
37 extern float * rcmat_lsqfit ( int npt, float *far, int nref, float *ref[] ) ;
38 extern rcmat * rcmat_normeqn( int npt,             int nref, float *ref[] ) ;
39 
40 extern rcmat * rcmat_from_rows( int nn , float *rr[] ) ;
41 
42 #endif /* _AFNI_RCMAT_HEADER_ */
43