Mercurial > repos > vipints > rdiff
diff rDiff/src/locfit/Source/mlfut.c @ 0:0f80a5141704
version 0.3 uploaded
author | vipints |
---|---|
date | Thu, 14 Feb 2013 23:38:36 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rDiff/src/locfit/Source/mlfut.c Thu Feb 14 23:38:36 2013 -0500 @@ -0,0 +1,134 @@ +#include "mex.h" +#include "lfev.h" + +void lfmxdata(lfdata *lfd, const mxArray *data) +{ const mxArray *tmp; + double *x, *sc, *xl; + int n, d, i, k; + char c, ststr[16]; + + n = lfd->n = mxGetM(mxGetField(data,0,"x")); + d = lfd->d = mxGetN(mxGetField(data,0,"x")); + x = mxGetPr(mxGetField(data,0,"x")); + for (i=0; i<d; i++) lfd->x[i] = &x[i*n]; + + lfd->y = mxGetPr(mxGetField(data,0,"y")); + + tmp = mxGetField(data,0,"weights"); + k = mxGetM(tmp); + lfd->w = (k>1) ? mxGetPr(tmp) : NULL; + + tmp = mxGetField(data,0,"censor"); + k = mxGetM(tmp); + lfd->c = (k>1) ? mxGetPr(tmp) : NULL; + + tmp = mxGetField(data,0,"baseline"); + k = mxGetM(tmp); + lfd->b = (k>1) ? mxGetPr(tmp) : NULL; + + mxGetString(mxGetField(data,0,"style"),ststr,16); + k = strlen(ststr); + for (i=0; i<d; i++) + { c = (k==1) ? ststr[0] : ststr[i]; + switch(c) + { case 'a': lfd->sty[i] = STANGL; break; + case 'l': lfd->sty[i] = STLEFT; break; + case 'r': lfd->sty[i] = STRIGH; break; + case 'c': lfd->sty[i] = STCPAR; break; + default: lfd->sty[i] = 1; break; + } + } + + sc = mxGetPr(mxGetField(data,0,"scales")); + k = mxGetN(mxGetField(data,0,"scales")); + for (i=0; i<d; i++) lfd->sca[i] = (k==1) ? sc[0] : sc[i]; + + xl = mxGetPr(mxGetField(data,0,"xlim")); + for (i=0; i<d; i++) + { lfd->xl[i] = xl[2*i]; + lfd->xl[i+d] = xl[2*i+1]; + } +} + +void lfmxsp(smpar *sp, mxArray *mcell, int d) +{ double *alpha; + char str[16]; + + alpha = mxGetPr(mxGetField(mcell,0,"alpha")); + nn(sp) = alpha[0]; + fixh(sp)= alpha[1]; + pen(sp) = alpha[2]; + + mxGetString(mxGetField(mcell,0,"adaptive_criterion"),str,16); + acri(sp) = lfacri(str); + + deg(sp) = mxGetPr(mxGetField(mcell,0,"degree"))[0]; + deg0(sp) = -1; + + mxGetString(mxGetField(mcell,0,"family"),str,16); + fam(sp) = lffamily(str); + mxGetString(mxGetField(mcell,0,"link"),str,16); + link(sp) = lflink(str); + setfamily(sp); + + mxGetString(mxGetField(mcell,0,"kernel"),str,16); + ker(sp) = lfkernel(str); + mxGetString(mxGetField(mcell,0,"kernel_type"),str,16); + kt(sp) = lfketype(str); + npar(sp) = calcp(sp,d); + + de_renorm = (int)(mxGetPr(mxGetField(mcell,0,"deren"))[0]); + mxGetString(mxGetField(mcell,0,"deit"),str,16); + de_itype = deitype(str); + de_mint = (int)(mxGetPr(mxGetField(mcell,0,"demint"))[0]); + lf_debug = (int)(mxGetPr(mxGetField(mcell,0,"debug"))[0]); +} + +void lfmxevs(lfit *lf, mxArray *mcell) +{ int d, i, j; + double *ll, *ur, *mg, *drv; + char evstr[16], mod[16], mdir[256]; + evstruc *evs; + fitpt *fp; + deriv *dv; + + evs = &lf->evs; + fp = &lf->fp; + dv = &lf->dv; + d = lf->lfd.d; + + if (mxIsChar(mxGetField(mcell,0,"type"))) + { mxGetString(mxGetField(mcell,0,"type"),evstr,16); + ev(evs) = lfevstr(evstr); + } + else + { ev(evs) = EPRES; + evs->mg[0] = mxGetN(mxGetField(mcell,0,"type")); + fp->xev = mxGetPr(mxGetField(mcell,0,"type")); + } + + + mxGetString(mxGetField(mxGetField(mcell,0,"module"),0,"name"),mod,16); + mxGetString(mxGetField(mxGetField(mcell,0,"module"),0,"directory"),mdir,256); + MODPARAMS(lf) = mxGetPr(mxGetField(mxGetField(mcell,0,"module"),0,"parameters")); + MODNPARAMS(lf) = mxGetN(mxGetField(mxGetField(mcell,0,"module"),0,"parameters")); + initmodule(&lf->mdl,mod,mdir,lf); + + + ll = mxGetPr(mxGetField(mcell,0,"lower_left")); + ur = mxGetPr(mxGetField(mcell,0,"upper_right")); + mg = mxGetPr(mxGetField(mcell,0,"grid")); + j = mxGetN(mxGetField(mcell,0,"grid")); + cut(evs) = mxGetPr(mxGetField(mcell,0,"cut"))[0]; + for (i=0; i<d; i++) + { evs->fl[i] = ll[i]; + evs->fl[i+d] = ur[i]; + if (ev(evs) != EPRES) evs->mg[i] = (j==1) ? mg[0] : mg[i]; + } + mk(evs) = mxGetPr(mxGetField(mcell,0,"maxk"))[0]; + + drv = mxGetPr(mxGetField(mcell,0,"derivative")); + j = mxGetN(mxGetField(mcell,0,"derivative")); + for (i=0; i<j; i++) dv->deriv[i] = drv[i]-1; + dv->nd = (drv[0]>0) ? j : 0; +}