comparison Problems/private/sprow.c @ 15:51b76c31c93d

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