// version 1.0.0 14Feb2018 #include #include #include "stplugin.h" #include "mycalcsw.h" // Note: Matrices are long vectors with row-major storage // The i,j element of an r x c matrix is // the (i-1)*r + (j-1) element of the of the vector // under C-style zero-base indexing // // Define preprocesor macros to facilitate readability #define M(i, j) *(*mat + (i)*c + j) #define B(j) *(bmat+j) #define E(j) *(emat+j) #define V(i, j) *(vmat + (i)*c + j) #define C(i, j) *(cmat + (i)*c + j) ST_retcode InitCmat(ST_double **mat, ST_int r, ST_int c) { ST_int i, j ; char msg[80] ; *mat = (ST_double *) malloc((size_t) r*c*sizeof(ST_double)) ; if (*mat == NULL ) { sprintf(msg, "Insufficient memory\n") ; SF_error(msg) ; return( (ST_retcode) 909) ; } for(i=0; i0) { sprintf(msg, "Problem accessing Stata data\n") ; SF_error(msg) ; return(rc) ; } if (SF_is_missing(value)) { sprintf(msg, "missing values encountered\n") ; SF_error(msg) ; return( (ST_retcode) 416 ) ; } B(j) += value ; } } } DivideByScalar(bmat, (ST_int) 1, nVars, (ST_double) *nObs) ; return(rc) ; } ST_retcode MyV(ST_double *bmat, ST_double *vmat, ST_int first, ST_int last, ST_int nVars, ST_int nObs) { ST_int i, j, j2, c ; ST_double *emat, value ; char msg[80] ; ST_retcode rc ; // used in macros for matrices c = nVars ; emat = NULL; rc = InitCmat(&emat, 1, nVars ) ; if (rc>0) { return( rc ) ; } for(i=first-1; i0) { free(emat) ; sprintf(msg, "Problem accessing Stata data\n") ; SF_error(msg) ; return(rc) ; } if (SF_is_missing(value)) { free(emat) ; sprintf(msg, "missing values encountered\n") ; SF_error(msg) ; return( (ST_retcode) 416 ) ; } E(j) = value - B(j) ; } for(j=0; j0) { sprintf(msg, "cannot access Stata matrix %s\n", smat) ; SF_error(msg) ; return(rc) ; } } } return(rc) ; } // Replace each element in r x c matrix mat with that element // divided by val void DivideByScalar(ST_double *vmat, ST_int r, ST_int c, ST_double val) { ST_int i, j ; for(i=0; i