annotate DL/RLS-DLA/private/rowlincomb.c @ 60:ad36f80e2ccf

(none)
author idamnjanovic
date Tue, 15 Mar 2011 12:20:59 +0000
parents
children
rev   line source
idamnjanovic@60 1 /**************************************************************************
idamnjanovic@60 2 *
idamnjanovic@60 3 * File name: rowlincomb.c
idamnjanovic@60 4 *
idamnjanovic@60 5 * Ron Rubinstein
idamnjanovic@60 6 * Computer Science Department
idamnjanovic@60 7 * Technion, Haifa 32000 Israel
idamnjanovic@60 8 * ronrubin@cs
idamnjanovic@60 9 *
idamnjanovic@60 10 * Last Updated: 21.5.2009
idamnjanovic@60 11 *
idamnjanovic@60 12 *************************************************************************/
idamnjanovic@60 13
idamnjanovic@60 14 #include "mex.h"
idamnjanovic@60 15
idamnjanovic@60 16
idamnjanovic@60 17 /* Input Arguments */
idamnjanovic@60 18
idamnjanovic@60 19 #define X_IN prhs[0]
idamnjanovic@60 20 #define A_IN prhs[1]
idamnjanovic@60 21 #define ROWS_IN prhs[2]
idamnjanovic@60 22 #define COLS_IN prhs[3]
idamnjanovic@60 23
idamnjanovic@60 24
idamnjanovic@60 25 /* Output Arguments */
idamnjanovic@60 26
idamnjanovic@60 27 #define Y_OUT plhs[0]
idamnjanovic@60 28
idamnjanovic@60 29
idamnjanovic@60 30 void mexFunction(int nlhs, mxArray *plhs[],
idamnjanovic@60 31 int nrhs, const mxArray*prhs[])
idamnjanovic@60 32
idamnjanovic@60 33 {
idamnjanovic@60 34 double *A, *x, *y, *rows, *cols;
idamnjanovic@60 35 mwSize m,n,m1,n1,m2,n2,rownum,colnum;
idamnjanovic@60 36 mwIndex *row_ids,*col_ids,i,j;
idamnjanovic@60 37 int colnumspecified=0;
idamnjanovic@60 38
idamnjanovic@60 39
idamnjanovic@60 40 /* Check for proper number of arguments */
idamnjanovic@60 41
idamnjanovic@60 42 if (nrhs!=3 && nrhs!=4) {
idamnjanovic@60 43 mexErrMsgTxt("Invalid number of input arguments.");
idamnjanovic@60 44 } else if (nlhs > 1) {
idamnjanovic@60 45 mexErrMsgTxt("Too many output arguments.");
idamnjanovic@60 46 }
idamnjanovic@60 47
idamnjanovic@60 48
idamnjanovic@60 49 /* Check the input dimensions */
idamnjanovic@60 50
idamnjanovic@60 51 m = mxGetM(A_IN);
idamnjanovic@60 52 n = mxGetN(A_IN);
idamnjanovic@60 53 if (!mxIsDouble(A_IN) || mxIsComplex(A_IN) || mxGetNumberOfDimensions(A_IN)>2) {
idamnjanovic@60 54 mexErrMsgTxt("ROWLINCOMB requires that A be a double matrix.");
idamnjanovic@60 55 }
idamnjanovic@60 56
idamnjanovic@60 57 m1 = mxGetM(ROWS_IN);
idamnjanovic@60 58 n1 = mxGetN(ROWS_IN);
idamnjanovic@60 59 if (!mxIsDouble(ROWS_IN) || mxIsComplex(ROWS_IN) || (m1!=1 && n1!=1)) {
idamnjanovic@60 60 mexErrMsgTxt("ROWLINCOMB requires that ROWS be an index vector of type double.");
idamnjanovic@60 61 }
idamnjanovic@60 62 rownum = (m1 > n1) ? m1 : n1; /* the number of rows in the linear combination */
idamnjanovic@60 63
idamnjanovic@60 64 m2 = mxGetM(X_IN);
idamnjanovic@60 65 n2 = mxGetN(X_IN);
idamnjanovic@60 66 if (!mxIsDouble(X_IN) || mxIsComplex(X_IN) || ((m2!=1) && (n2!=1))) {
idamnjanovic@60 67 mexErrMsgTxt("ROWLINCOMB requires that X be a double vector.");
idamnjanovic@60 68 }
idamnjanovic@60 69
idamnjanovic@60 70 if (m2 != rownum && n2 != rownum) {
idamnjanovic@60 71 mexErrMsgTxt("The length of X does not match the number of rows in ROWS.");
idamnjanovic@60 72 }
idamnjanovic@60 73
idamnjanovic@60 74 if (nrhs==4) {
idamnjanovic@60 75 m1 = mxGetM(COLS_IN);
idamnjanovic@60 76 n1 = mxGetN(COLS_IN);
idamnjanovic@60 77 if (!mxIsDouble(COLS_IN) || mxIsComplex(COLS_IN) || (m1!=1 && n1!=1)) {
idamnjanovic@60 78 mexErrMsgTxt("ROWLINCOMB requires that COLS be an index vector of type double.");
idamnjanovic@60 79 }
idamnjanovic@60 80 colnum = (m1 > n1) ? m1 : n1; /* the number of columns */
idamnjanovic@60 81 colnumspecified = 1;
idamnjanovic@60 82 cols = mxGetPr(COLS_IN);
idamnjanovic@60 83
idamnjanovic@60 84 Y_OUT = mxCreateDoubleMatrix(1, colnum, mxREAL);
idamnjanovic@60 85 }
idamnjanovic@60 86 else {
idamnjanovic@60 87 cols = 0;
idamnjanovic@60 88 Y_OUT = mxCreateDoubleMatrix(1, n, mxREAL);
idamnjanovic@60 89 }
idamnjanovic@60 90
idamnjanovic@60 91
idamnjanovic@60 92 /* Assign pointers to the various parameters */
idamnjanovic@60 93 A = mxGetPr(A_IN);
idamnjanovic@60 94 rows = mxGetPr(ROWS_IN);
idamnjanovic@60 95 x = mxGetPr(X_IN);
idamnjanovic@60 96 y = mxGetPr(Y_OUT);
idamnjanovic@60 97
idamnjanovic@60 98
idamnjanovic@60 99 /* check row indices */
idamnjanovic@60 100
idamnjanovic@60 101 row_ids = (mwIndex*)mxMalloc(rownum*sizeof(mwIndex));
idamnjanovic@60 102
idamnjanovic@60 103 for (i=0; i<rownum; ++i) {
idamnjanovic@60 104 row_ids[i] = (mwIndex)(rows[i]+0.1)-1;
idamnjanovic@60 105 if (row_ids[i]<0 || row_ids[i]>=m) {
idamnjanovic@60 106 mexErrMsgTxt("Row index in ROWS is out of range.");
idamnjanovic@60 107 }
idamnjanovic@60 108 }
idamnjanovic@60 109
idamnjanovic@60 110
idamnjanovic@60 111
idamnjanovic@60 112 if (colnumspecified) {
idamnjanovic@60 113
idamnjanovic@60 114 /* check column indices */
idamnjanovic@60 115 col_ids = (mwIndex*)mxMalloc(colnum*sizeof(mwIndex));
idamnjanovic@60 116
idamnjanovic@60 117 for (i=0; i<colnum; ++i) {
idamnjanovic@60 118 col_ids[i] = (mwIndex)(cols[i]+0.1)-1;
idamnjanovic@60 119 if (col_ids[i]<0 || col_ids[i]>=n) {
idamnjanovic@60 120 mexErrMsgTxt("Column index in COLS is out of range.");
idamnjanovic@60 121 }
idamnjanovic@60 122 }
idamnjanovic@60 123
idamnjanovic@60 124 /* Do the actual computation */
idamnjanovic@60 125 for (j=0; j<colnum; ++j) {
idamnjanovic@60 126 for (i=0; i<rownum; ++i) {
idamnjanovic@60 127 y[j] += A[m*col_ids[j]+row_ids[i]]*x[i];
idamnjanovic@60 128 }
idamnjanovic@60 129 }
idamnjanovic@60 130
idamnjanovic@60 131 mxFree(col_ids);
idamnjanovic@60 132 }
idamnjanovic@60 133
idamnjanovic@60 134 else {
idamnjanovic@60 135
idamnjanovic@60 136 /* Do the actual computation */
idamnjanovic@60 137 for (j=0; j<n; ++j) {
idamnjanovic@60 138 for (i=0; i<rownum; ++i) {
idamnjanovic@60 139 y[j] += A[m*j+row_ids[i]]*x[i];
idamnjanovic@60 140 }
idamnjanovic@60 141 }
idamnjanovic@60 142 }
idamnjanovic@60 143
idamnjanovic@60 144
idamnjanovic@60 145 mxFree(row_ids);
idamnjanovic@60 146
idamnjanovic@60 147 return;
idamnjanovic@60 148 }