idamnjanovic@10: /************************************************************************** idamnjanovic@10: * idamnjanovic@10: * File name: rowlincomb.c idamnjanovic@10: * idamnjanovic@10: * Ron Rubinstein idamnjanovic@10: * Computer Science Department idamnjanovic@10: * Technion, Haifa 32000 Israel idamnjanovic@10: * ronrubin@cs idamnjanovic@10: * idamnjanovic@10: * Last Updated: 21.5.2009 idamnjanovic@10: * idamnjanovic@10: *************************************************************************/ idamnjanovic@10: idamnjanovic@10: #include "mex.h" idamnjanovic@10: idamnjanovic@10: idamnjanovic@10: /* Input Arguments */ idamnjanovic@10: idamnjanovic@10: #define X_IN prhs[0] idamnjanovic@10: #define A_IN prhs[1] idamnjanovic@10: #define ROWS_IN prhs[2] idamnjanovic@10: #define COLS_IN prhs[3] idamnjanovic@10: idamnjanovic@10: idamnjanovic@10: /* Output Arguments */ idamnjanovic@10: idamnjanovic@10: #define Y_OUT plhs[0] idamnjanovic@10: idamnjanovic@10: idamnjanovic@10: void mexFunction(int nlhs, mxArray *plhs[], idamnjanovic@10: int nrhs, const mxArray*prhs[]) idamnjanovic@10: idamnjanovic@10: { idamnjanovic@10: double *A, *x, *y, *rows, *cols; idamnjanovic@10: mwSize m,n,m1,n1,m2,n2,rownum,colnum; idamnjanovic@10: mwIndex *row_ids,*col_ids,i,j; idamnjanovic@10: int colnumspecified=0; idamnjanovic@10: idamnjanovic@10: idamnjanovic@10: /* Check for proper number of arguments */ idamnjanovic@10: idamnjanovic@10: if (nrhs!=3 && nrhs!=4) { idamnjanovic@10: mexErrMsgTxt("Invalid number of input arguments."); idamnjanovic@10: } else if (nlhs > 1) { idamnjanovic@10: mexErrMsgTxt("Too many output arguments."); idamnjanovic@10: } idamnjanovic@10: idamnjanovic@10: idamnjanovic@10: /* Check the input dimensions */ idamnjanovic@10: idamnjanovic@10: m = mxGetM(A_IN); idamnjanovic@10: n = mxGetN(A_IN); idamnjanovic@10: if (!mxIsDouble(A_IN) || mxIsComplex(A_IN) || mxGetNumberOfDimensions(A_IN)>2) { idamnjanovic@10: mexErrMsgTxt("ROWLINCOMB requires that A be a double matrix."); idamnjanovic@10: } idamnjanovic@10: idamnjanovic@10: m1 = mxGetM(ROWS_IN); idamnjanovic@10: n1 = mxGetN(ROWS_IN); idamnjanovic@10: if (!mxIsDouble(ROWS_IN) || mxIsComplex(ROWS_IN) || (m1!=1 && n1!=1)) { idamnjanovic@10: mexErrMsgTxt("ROWLINCOMB requires that ROWS be an index vector of type double."); idamnjanovic@10: } idamnjanovic@10: rownum = (m1 > n1) ? m1 : n1; /* the number of rows in the linear combination */ idamnjanovic@10: idamnjanovic@10: m2 = mxGetM(X_IN); idamnjanovic@10: n2 = mxGetN(X_IN); idamnjanovic@10: if (!mxIsDouble(X_IN) || mxIsComplex(X_IN) || ((m2!=1) && (n2!=1))) { idamnjanovic@10: mexErrMsgTxt("ROWLINCOMB requires that X be a double vector."); idamnjanovic@10: } idamnjanovic@10: idamnjanovic@10: if (m2 != rownum && n2 != rownum) { idamnjanovic@10: mexErrMsgTxt("The length of X does not match the number of rows in ROWS."); idamnjanovic@10: } idamnjanovic@10: idamnjanovic@10: if (nrhs==4) { idamnjanovic@10: m1 = mxGetM(COLS_IN); idamnjanovic@10: n1 = mxGetN(COLS_IN); idamnjanovic@10: if (!mxIsDouble(COLS_IN) || mxIsComplex(COLS_IN) || (m1!=1 && n1!=1)) { idamnjanovic@10: mexErrMsgTxt("ROWLINCOMB requires that COLS be an index vector of type double."); idamnjanovic@10: } idamnjanovic@10: colnum = (m1 > n1) ? m1 : n1; /* the number of columns */ idamnjanovic@10: colnumspecified = 1; idamnjanovic@10: cols = mxGetPr(COLS_IN); idamnjanovic@10: idamnjanovic@10: Y_OUT = mxCreateDoubleMatrix(1, colnum, mxREAL); idamnjanovic@10: } idamnjanovic@10: else { idamnjanovic@10: cols = 0; idamnjanovic@10: Y_OUT = mxCreateDoubleMatrix(1, n, mxREAL); idamnjanovic@10: } idamnjanovic@10: idamnjanovic@10: idamnjanovic@10: /* Assign pointers to the various parameters */ idamnjanovic@10: A = mxGetPr(A_IN); idamnjanovic@10: rows = mxGetPr(ROWS_IN); idamnjanovic@10: x = mxGetPr(X_IN); idamnjanovic@10: y = mxGetPr(Y_OUT); idamnjanovic@10: idamnjanovic@10: idamnjanovic@10: /* check row indices */ idamnjanovic@10: idamnjanovic@10: row_ids = (mwIndex*)mxMalloc(rownum*sizeof(mwIndex)); idamnjanovic@10: idamnjanovic@10: for (i=0; i=m) { idamnjanovic@10: mexErrMsgTxt("Row index in ROWS is out of range."); idamnjanovic@10: } idamnjanovic@10: } idamnjanovic@10: idamnjanovic@10: idamnjanovic@10: idamnjanovic@10: if (colnumspecified) { idamnjanovic@10: idamnjanovic@10: /* check column indices */ idamnjanovic@10: col_ids = (mwIndex*)mxMalloc(colnum*sizeof(mwIndex)); idamnjanovic@10: idamnjanovic@10: for (i=0; i=n) { idamnjanovic@10: mexErrMsgTxt("Column index in COLS is out of range."); idamnjanovic@10: } idamnjanovic@10: } idamnjanovic@10: idamnjanovic@10: /* Do the actual computation */ idamnjanovic@10: for (j=0; j