annotate DL/RLS-DLA/private/sprow.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: sprow.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: 24.8.2009
idamnjanovic@60 11 *
idamnjanovic@60 12 *************************************************************************/
idamnjanovic@60 13
idamnjanovic@60 14
idamnjanovic@60 15 #include "mex.h"
idamnjanovic@60 16 #include "mexutils.h"
idamnjanovic@60 17
idamnjanovic@60 18
idamnjanovic@60 19 /* Input Arguments */
idamnjanovic@60 20
idamnjanovic@60 21 #define A_IN prhs[0]
idamnjanovic@60 22 #define J_IN prhs[1]
idamnjanovic@60 23
idamnjanovic@60 24
idamnjanovic@60 25 /* Output Arguments */
idamnjanovic@60 26
idamnjanovic@60 27 #define X_OUT plhs[0]
idamnjanovic@60 28 #define ID_OUT plhs[1]
idamnjanovic@60 29
idamnjanovic@60 30
idamnjanovic@60 31 void mexFunction(int nlhs, mxArray *plhs[],
idamnjanovic@60 32 int nrhs, const mxArray*prhs[])
idamnjanovic@60 33
idamnjanovic@60 34 {
idamnjanovic@60 35 double *pr, *x, *id, rowid;
idamnjanovic@60 36 mwIndex *ir, *jc;
idamnjanovic@60 37 mwSize m, n;
idamnjanovic@60 38 mwIndex i, j, k, l, rowlen;
idamnjanovic@60 39
idamnjanovic@60 40 if (nrhs != 2) {
idamnjanovic@60 41 mexErrMsgTxt("GETSPROW requires two input arguments.");
idamnjanovic@60 42 } else if (nlhs > 2) {
idamnjanovic@60 43 mexErrMsgTxt("Too many output arguments.");
idamnjanovic@60 44 }
idamnjanovic@60 45
idamnjanovic@60 46 checkmatrix(A_IN, "GETSPROW", "A");
idamnjanovic@60 47 checksparse(A_IN, "GETSPROW", "A");
idamnjanovic@60 48 checkscalar(J_IN, "GETSPROW", "J");
idamnjanovic@60 49
idamnjanovic@60 50 m = mxGetM(A_IN);
idamnjanovic@60 51 n = mxGetN(A_IN);
idamnjanovic@60 52
idamnjanovic@60 53 rowid = mxGetScalar(J_IN);
idamnjanovic@60 54 if (rowid < 0) {
idamnjanovic@60 55 mexErrMsgTxt("Invalid row index.");
idamnjanovic@60 56 }
idamnjanovic@60 57 j = (mwIndex)(rowid + 1e-2);
idamnjanovic@60 58 if (j<1 || j>m) {
idamnjanovic@60 59 mexErrMsgTxt("Row index is out of range.");
idamnjanovic@60 60 }
idamnjanovic@60 61 j--;
idamnjanovic@60 62
idamnjanovic@60 63 pr = mxGetPr(A_IN);
idamnjanovic@60 64 ir = mxGetIr(A_IN);
idamnjanovic@60 65 jc = mxGetJc(A_IN);
idamnjanovic@60 66
idamnjanovic@60 67 /* Determine length of row */
idamnjanovic@60 68 rowlen = 0;
idamnjanovic@60 69 for (i=0; i<jc[n]; ++i) {
idamnjanovic@60 70 rowlen += (ir[i]==j);
idamnjanovic@60 71 }
idamnjanovic@60 72
idamnjanovic@60 73 /* Allocate output parameters */
idamnjanovic@60 74 X_OUT = mxCreateDoubleMatrix(1, rowlen, mxREAL);
idamnjanovic@60 75 ID_OUT = mxCreateDoubleMatrix(1, rowlen, mxREAL);
idamnjanovic@60 76
idamnjanovic@60 77 x = mxGetPr(X_OUT);
idamnjanovic@60 78 id = mxGetPr(ID_OUT);
idamnjanovic@60 79
idamnjanovic@60 80 /* Compute j-th row */
idamnjanovic@60 81 k=0;
idamnjanovic@60 82 for (l=1; l<=n; ++l) {
idamnjanovic@60 83 i = jc[l-1];
idamnjanovic@60 84 while (i<jc[l] && ir[i]<j) {
idamnjanovic@60 85 i++;
idamnjanovic@60 86 }
idamnjanovic@60 87 if (i<jc[l] && ir[i]==j) {
idamnjanovic@60 88 x[k] = pr[i];
idamnjanovic@60 89 id[k] = l;
idamnjanovic@60 90 k++;
idamnjanovic@60 91 }
idamnjanovic@60 92 }
idamnjanovic@60 93
idamnjanovic@60 94 }