1 #include "cs_mex.h"
2 /* cs_qrsol: solve least squares or underdetermined problem */
mexFunction(int nargout,mxArray * pargout[],int nargin,const mxArray * pargin[])3 void mexFunction
4 (
5     int nargout,
6     mxArray *pargout [ ],
7     int nargin,
8     const mxArray *pargin [ ]
9 )
10 {
11     CS_INT k, order ;
12     if (nargout > 1 || nargin < 2 || nargin > 3)
13     {
14         mexErrMsgTxt ("Usage: x = cs_qrsol(A,b,order)") ;
15     }
16     order = (nargin < 3) ? 3 : mxGetScalar (pargin [2]) ;
17     order = CS_MAX (order, 0) ;
18     order = CS_MIN (order, 3) ;
19 
20     if (mxIsComplex (pargin [0]) || mxIsComplex (pargin [1]))
21     {
22 #ifndef NCOMPLEX
23         cs_cl *A, Amatrix ;
24         cs_complex_t *x, *b ;
25         A = cs_cl_mex_get_sparse (&Amatrix, 0, pargin [0]) ;    /* get A */
26         b = cs_cl_mex_get_double (A->m, pargin [1]) ;           /* get b */
27         x = cs_dl_calloc (CS_MAX (A->m, A->n), sizeof (cs_complex_t)) ;
28         for (k = 0 ; k < A->m ; k++) x [k] = b [k] ;            /* x = b */
29         cs_free (b) ;
30         if (!cs_cl_qrsol (order, A, x))                         /* x = A\x */
31         {
32             mexErrMsgTxt ("QR solve failed") ;
33         }
34         pargout [0] = cs_cl_mex_put_double (A->n, x) ;          /* return x */
35 #else
36         mexErrMsgTxt ("complex matrices not supported") ;
37 #endif
38     }
39     else
40     {
41         cs_dl *A, Amatrix ;
42         double *x, *b ;
43         A = cs_dl_mex_get_sparse (&Amatrix, 0, 1, pargin [0]) ;     /* get A */
44         b = cs_dl_mex_get_double (A->m, pargin [1]) ;               /* get b */
45         x = cs_dl_calloc (CS_MAX (A->m, A->n), sizeof (double)) ;   /* x = b */
46         for (k = 0 ; k < A->m ; k++) x [k] = b [k] ;
47         if (!cs_dl_qrsol (order, A, x))                         /* x = A\x */
48         {
49             mexErrMsgTxt ("QR solve failed") ;
50         }
51         cs_dl_mex_put_double (A->n, x, &(pargout [0])) ;        /* return x */
52         cs_free (x) ;
53     }
54 }
55