idamnjanovic@1: /************************************************************************** idamnjanovic@1: * idamnjanovic@1: * File name: addtocols.c idamnjanovic@1: * idamnjanovic@1: * Ron Rubinstein idamnjanovic@1: * Computer Science Department idamnjanovic@1: * Technion, Haifa 32000 Israel idamnjanovic@1: * ronrubin@cs idamnjanovic@1: * idamnjanovic@1: * Last Updated: 19.4.2009 idamnjanovic@1: * idamnjanovic@1: *************************************************************************/ idamnjanovic@1: idamnjanovic@1: idamnjanovic@1: #include "mex.h" idamnjanovic@1: idamnjanovic@1: idamnjanovic@1: /* Input Arguments */ idamnjanovic@1: idamnjanovic@1: #define X_IN prhs[0] idamnjanovic@1: #define V_IN prhs[1] idamnjanovic@1: idamnjanovic@1: idamnjanovic@1: /* Output Arguments */ idamnjanovic@1: idamnjanovic@1: #define Y_OUT plhs[0] idamnjanovic@1: idamnjanovic@1: idamnjanovic@1: void mexFunction(int nlhs, mxArray *plhs[], idamnjanovic@1: int nrhs, const mxArray*prhs[]) idamnjanovic@1: idamnjanovic@1: { idamnjanovic@1: double *x, *y, *v, *xend; idamnjanovic@1: mwSize m,n,m1,n1; idamnjanovic@1: mwIndex counter; idamnjanovic@1: idamnjanovic@1: idamnjanovic@1: /* Check for proper number of arguments */ idamnjanovic@1: idamnjanovic@1: if (nrhs != 2) { idamnjanovic@1: mexErrMsgTxt("Two input arguments required."); idamnjanovic@1: } else if (nlhs > 1) { idamnjanovic@1: mexErrMsgTxt("Too many output arguments."); idamnjanovic@1: } idamnjanovic@1: idamnjanovic@1: idamnjanovic@1: /* Check the the input dimensions */ idamnjanovic@1: idamnjanovic@1: m = mxGetM(X_IN); idamnjanovic@1: n = mxGetN(X_IN); idamnjanovic@1: if (!mxIsDouble(X_IN) || mxIsComplex(X_IN) || mxGetNumberOfDimensions(X_IN)>2) { idamnjanovic@1: mexErrMsgTxt("ADDTOCOLS requires that X be a double matrix."); idamnjanovic@1: } idamnjanovic@1: m1 = mxGetM(V_IN); idamnjanovic@1: n1 = mxGetN(V_IN); idamnjanovic@1: if (!mxIsDouble(V_IN) || mxIsComplex(V_IN) || (m1!=1 && n1!=1)) { idamnjanovic@1: mexErrMsgTxt("ADDTOCOLS requires that V be a double vector."); idamnjanovic@1: } idamnjanovic@1: if ((m1==1 && n1!=n) || (n1==1 && m1!=n)) { idamnjanovic@1: mexErrMsgTxt("Error in ADDTOCOLS: dimensions of V and X must agree."); idamnjanovic@1: } idamnjanovic@1: idamnjanovic@1: idamnjanovic@1: /* Create a matrix for the return argument */ idamnjanovic@1: Y_OUT = mxCreateDoubleMatrix(m, n, mxREAL); idamnjanovic@1: idamnjanovic@1: idamnjanovic@1: /* Assign pointers to the various parameters */ idamnjanovic@1: x = mxGetPr(X_IN); idamnjanovic@1: v = mxGetPr(V_IN); idamnjanovic@1: y = mxGetPr(Y_OUT); idamnjanovic@1: idamnjanovic@1: idamnjanovic@1: /* Do the actual computation */ idamnjanovic@1: idamnjanovic@1: xend = x+(m*n); idamnjanovic@1: counter = 0; idamnjanovic@1: while (x