int main (void) { cs_dl *T, *A, *Eye, *AT, *C, *D ; UF_long i, m ; T = cs_dl_load (stdin) ; /* load triplet matrix T from stdin */ printf ("T:\n") ; cs_dl_print (T, 0) ; /* print T */ A = cs_dl_compress (T) ; /* A = compressed-column form of T */ printf ("A:\n") ; cs_dl_print (A, 0) ; /* print A */ cs_dl_spfree (T) ; /* clear T */ AT = cs_dl_transpose (A, 1) ; /* AT = A' */ printf ("AT:\n") ; cs_dl_print (AT, 0) ; /* print AT */ m = A ? A->m : 0 ; /* m = # of rows of A */ T = cs_dl_spalloc (m, m, m, 1, 1) ; /* create triplet identity matrix */ for (i = 0 ; i < m ; i++) cs_dl_entry (T, i, i, 1) ; Eye = cs_dl_compress (T) ; /* Eye = speye (m) */ cs_dl_spfree (T) ; C = cs_dl_multiply (A, AT) ; /* C = A*A' */ D = cs_dl_add (C, Eye, 1, cs_dl_norm (C)) ; /* D = C + Eye*norm (C,1) */ printf ("D:\n") ; cs_dl_print (D, 0) ; /* print D */ cs_dl_spfree (A) ; /* clear A AT C D Eye */ cs_dl_spfree (AT) ; cs_dl_spfree (C) ; cs_dl_spfree (D) ; cs_dl_spfree (Eye) ; return (0) ; }
void mexFunction ( int nargout, mxArray *pargout [ ], int nargin, const mxArray *pargin [ ] ) { if (nargout > 1 || nargin < 2 || nargin > 4) { mexErrMsgTxt ("Usage: C = cs_add(A,B,alpha,beta)") ; } if (mxIsComplex (pargin [0]) || mxIsComplex (pargin [1]) || (nargin > 2 && mxIsComplex (pargin [2])) || (nargin > 3 && mxIsComplex (pargin [3]))) { #ifndef NCOMPLEX cs_complex_t alpha, beta ; cs_cl Amatrix, Bmatrix, *A, *B, *C, *D ; A = cs_cl_mex_get_sparse (&Amatrix, 0, pargin [0]) ; /* get A */ B = cs_cl_mex_get_sparse (&Bmatrix, 0, pargin [1]) ; /* get B */ alpha = (nargin < 3) ? 1 : get_complex (pargin [2]) ; /* get alpha */ beta = (nargin < 4) ? 1 : get_complex (pargin [3]) ; /* get beta */ C = cs_cl_add (A,B,alpha,beta) ; /* C = alpha*A + beta *B */ cs_cl_dropzeros (C) ; /* drop zeros */ D = cs_cl_transpose (C, 1) ; /* sort result via double transpose */ cs_cl_spfree (C) ; C = cs_cl_transpose (D, 1) ; cs_cl_spfree (D) ; pargout [0] = cs_cl_mex_put_sparse (&C) ; /* return C */ #else mexErrMsgTxt ("complex matrices not supported") ; #endif } else { double alpha, beta ; cs_dl Amatrix, Bmatrix, *A, *B, *C, *D ; A = cs_dl_mex_get_sparse (&Amatrix, 0, 1, pargin [0]) ; /* get A */ B = cs_dl_mex_get_sparse (&Bmatrix, 0, 1, pargin [1]) ; /* get B */ alpha = (nargin < 3) ? 1 : mxGetScalar (pargin [2]) ; /* get alpha */ beta = (nargin < 4) ? 1 : mxGetScalar (pargin [3]) ; /* get beta */ C = cs_dl_add (A,B,alpha,beta) ; /* C = alpha*A + beta *B */ cs_dl_dropzeros (C) ; /* drop zeros */ D = cs_dl_transpose (C, 1) ; /* sort result via double transpose */ cs_dl_spfree (C) ; C = cs_dl_transpose (D, 1) ; cs_dl_spfree (D) ; pargout [0] = cs_dl_mex_put_sparse (&C) ; /* return C */ } }