annotate toolboxes/FullBNT-1.0.7/bnt/potentials/Tables/rep_mult.c @ 0:cc4b1211e677 tip

initial commit to HG from Changeset: 646 (e263d8a21543) added further path and more save "camirversion.m"
author Daniel Wolff
date Fri, 19 Aug 2016 13:07:06 +0200
parents
children
rev   line source
Daniel@0 1 /* rep_mult.c repmat first two operands to the size provided by */
Daniel@0 2 /* the third operand, then perform point multiply */
Daniel@0 3 /* 3 input, 1 output */
Daniel@0 4 /* C = rep_mult(A, B, sizes) */
Daniel@0 5
Daniel@0 6 #include "mex.h"
Daniel@0 7
Daniel@0 8 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
Daniel@0 9 {
Daniel@0 10 double *xp, *yp, *zp, *pSizes;
Daniel@0 11 int xnd, ynd, numElements = 1;
Daniel@0 12 const int *xdim, *ydim;
Daniel@0 13 int i, j, ndim;
Daniel@0 14 int *s, *sx, *sy, *cpsx, *cpsy;
Daniel@0 15 int *subs, *s1, *cpsx2, *cpsy2;
Daniel@0 16
Daniel@0 17 if (nrhs != 3)
Daniel@0 18 mexErrMsgTxt("Incorrect number of inputs.");
Daniel@0 19
Daniel@0 20 if (nlhs > 1)
Daniel@0 21 mexErrMsgTxt("Too many output arguments.");
Daniel@0 22
Daniel@0 23 xnd = mxGetNumberOfDimensions(prhs[0]);
Daniel@0 24 ynd = mxGetNumberOfDimensions(prhs[1]);
Daniel@0 25 xdim = mxGetDimensions(prhs[0]);
Daniel@0 26 ydim = mxGetDimensions(prhs[1]);
Daniel@0 27 ndim = mxGetNumberOfElements(prhs[2]);
Daniel@0 28
Daniel@0 29 pSizes = mxGetPr(prhs[2]);
Daniel@0 30
Daniel@0 31 sx = (int *)malloc(sizeof(int)*ndim);
Daniel@0 32 sy = (int *)malloc(sizeof(int)*ndim);
Daniel@0 33 s = (int *)malloc(sizeof(int)*ndim);
Daniel@0 34 s1 = (int *)malloc(sizeof(int)*ndim);
Daniel@0 35 *(cpsx = (int *)malloc(sizeof(int)*ndim)) = 1;
Daniel@0 36 *(cpsy = (int *)malloc(sizeof(int)*ndim)) = 1;
Daniel@0 37 subs = (int *)malloc(sizeof(int)*ndim);
Daniel@0 38 cpsx2 = (int *)malloc(sizeof(int)*ndim);
Daniel@0 39 cpsy2 = (int *)malloc(sizeof(int)*ndim);
Daniel@0 40 for(i=0; i<ndim; i++){
Daniel@0 41 subs[i] = 0;
Daniel@0 42 sx[i] = (i < xnd) ? xdim[i] : 1;
Daniel@0 43 sy[i] = (i < ynd) ? ydim[i] : 1;
Daniel@0 44 s[i] = (int)pSizes[i];
Daniel@0 45 s1[i] = s[i] - 1;
Daniel@0 46 numElements *= s[i];
Daniel@0 47 }
Daniel@0 48
Daniel@0 49 for(i=0; i<ndim-1; i++){
Daniel@0 50 cpsx[i+1] = cpsx[i]*sx[i]--;
Daniel@0 51 cpsy[i+1] = cpsy[i]*sy[i]--;
Daniel@0 52 cpsx2[i] = cpsx[i]*sx[i];
Daniel@0 53 cpsy2[i] = cpsy[i]*sy[i];
Daniel@0 54 }
Daniel@0 55 cpsx2[ndim-1] = cpsx[ndim-1]*(--sx[ndim-1]);
Daniel@0 56 cpsy2[ndim-1] = cpsy[ndim-1]*(--sy[ndim-1]);
Daniel@0 57
Daniel@0 58 plhs[0] = mxCreateNumericArray(ndim, s, mxDOUBLE_CLASS, mxREAL);
Daniel@0 59 zp = mxGetPr(plhs[0]);
Daniel@0 60 xp = mxGetPr(prhs[0]);
Daniel@0 61 yp = mxGetPr(prhs[1]);
Daniel@0 62
Daniel@0 63 for(j=0; j<numElements; j++){
Daniel@0 64 *zp++ = *xp * *yp;
Daniel@0 65 for(i=0; i<ndim; i++){
Daniel@0 66 if(subs[i] == s1[i]){
Daniel@0 67 subs[i] = 0;
Daniel@0 68 if(sx[i])
Daniel@0 69 xp -= cpsx2[i];
Daniel@0 70 if(sy[i])
Daniel@0 71 yp -= cpsy2[i];
Daniel@0 72 }
Daniel@0 73 else{
Daniel@0 74 subs[i]++;
Daniel@0 75 if(sx[i])
Daniel@0 76 xp += cpsx[i];
Daniel@0 77 if(sy[i])
Daniel@0 78 yp += cpsy[i];
Daniel@0 79 break;
Daniel@0 80 }
Daniel@0 81 }
Daniel@0 82 }
Daniel@0 83 free(sx);
Daniel@0 84 free(sy);
Daniel@0 85 free(s);
Daniel@0 86 free(s1);
Daniel@0 87 free(cpsx);
Daniel@0 88 free(cpsy);
Daniel@0 89 free(subs);
Daniel@0 90 free(cpsx2);
Daniel@0 91 free(cpsy2);
Daniel@0 92 }