2
/* cs_qr: sparse QR factorization */
8
const mxArray *pargin [ ]
11
CS_INT m, n, order, *p ;
12
if (nargout > 5 || nargin != 1)
14
mexErrMsgTxt ("Usage: [V,beta,p,R,q] = cs_qr(A)") ;
16
order = (nargout == 5) ? 3 : 0 ; /* determine ordering */
17
m = mxGetM (pargin [0]) ;
18
n = mxGetN (pargin [0]) ;
19
if (m < n) mexErrMsgTxt ("A must have # rows >= # columns") ;
20
if (mxIsComplex (pargin [0]))
25
cs_cl Amatrix, *A, *D ;
26
A = cs_cl_mex_get_sparse (&Amatrix, 0, pargin [0]) ; /* get A */
27
S = cs_cl_sqr (order, A, 1) ; /* symbolic QR ordering & analysis*/
28
N = cs_cl_qr (A, S) ; /* numeric QR factorization */
30
if (!N) mexErrMsgTxt ("qr failed") ;
31
cs_cl_dropzeros (N->L) ; /* drop zeros from V and sort */
32
D = cs_cl_transpose (N->L, 1) ;
34
N->L = cs_cl_transpose (D, 1) ;
36
cs_cl_dropzeros (N->U) ; /* drop zeros from R and sort */
37
D = cs_cl_transpose (N->U, 1) ;
39
N->U = cs_cl_transpose (D, 1) ;
41
m = N->L->m ; /* m may be larger now */
42
p = cs_cl_pinv (S->pinv, m) ; /* p = pinv' */
43
pargout [0] = cs_cl_mex_put_sparse (&(N->L)) ; /* return V */
44
cs_dl_mex_put_double (n, N->B, &(pargout [1])) ; /* return beta */
45
pargout [2] = cs_dl_mex_put_int (p, m, 1, 1) ; /* return p */
46
pargout [3] = cs_cl_mex_put_sparse (&(N->U)) ; /* return R */
47
pargout [4] = cs_dl_mex_put_int (S->q, n, 1, 0) ; /* return q */
51
mexErrMsgTxt ("complex matrices not supported") ;
58
cs_dl Amatrix, *A, *D ;
59
A = cs_dl_mex_get_sparse (&Amatrix, 0, 1, pargin [0]) ; /* get A */
60
S = cs_dl_sqr (order, A, 1) ; /* symbolic QR ordering & analysis*/
61
N = cs_dl_qr (A, S) ; /* numeric QR factorization */
62
if (!N) mexErrMsgTxt ("qr failed") ;
63
cs_dl_dropzeros (N->L) ; /* drop zeros from V and sort */
64
D = cs_dl_transpose (N->L, 1) ;
66
N->L = cs_dl_transpose (D, 1) ;
68
cs_dl_dropzeros (N->U) ; /* drop zeros from R and sort */
69
D = cs_dl_transpose (N->U, 1) ;
71
N->U = cs_dl_transpose (D, 1) ;
73
m = N->L->m ; /* m may be larger now */
74
p = cs_dl_pinv (S->pinv, m) ; /* p = pinv' */
75
pargout [0] = cs_dl_mex_put_sparse (&(N->L)) ; /* return V */
76
cs_dl_mex_put_double (n, N->B, &(pargout [1])) ; /* return beta */
77
pargout [2] = cs_dl_mex_put_int (p, m, 1, 1) ; /* return p */
78
pargout [3] = cs_dl_mex_put_sparse (&(N->U)) ; /* return R */
79
pargout [4] = cs_dl_mex_put_int (S->q, n, 1, 0) ; /* return q */