/* Usage
*
* [p,q,cp,ssize] = dp (A)
*
*/
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#include "mex.h"
#include "btf.h"
void mexFunction
(
int nargout,
mxArray *pargout [ ],
int nargin,
const mxArray *pargin [ ]
)
{
int nrow, ncol, i, *Ap, *Ai, *ATp, *ATi, cp [5], rp [5], *P, *Q, k ;
double *x ;
/* ---------------------------------------------------------------------- */
/* get inputs and allocate workspace */
/* ---------------------------------------------------------------------- */
if (nargin != 2 || nargout > 4)
{
mexErrMsgTxt ("Usage: [p,q,cp,rp] = dp (A,A')") ;
}
nrow = mxGetM (pargin [0]) ;
ncol = mxGetN (pargin [0]) ;
if (!mxIsSparse (pargin [0]))
{
mexErrMsgTxt ("maxtrans: A must be sparse, and non-empty") ;
}
/* get sparse matrix A */
Ap = mxGetJc (pargin [0]) ;
Ai = mxGetIr (pargin [0]) ;
/* get sparse matrix AT */
ATp = mxGetJc (pargin [1]) ;
ATi = mxGetIr (pargin [1]) ;
P = mxMalloc (nrow * sizeof (int)) ;
Q = mxMalloc (ncol * sizeof (int)) ;
printf ("nrow %d ncol %d\n", nrow, ncol) ;
dmperm (nrow, ncol, Ap, Ai, ATp, ATi, P, Q, cp, rp) ;
/* ---------------------------------------------------------------------- */
/* create outputs and free workspace */
/* ---------------------------------------------------------------------- */
pargout [0] = mxCreateDoubleMatrix (1, nrow, mxREAL) ;
x = mxGetPr (pargout [0]) ;
for (k = 0 ; k < nrow ; k++)
{
x [k] = P [k] + 1 ;
}
pargout [1] = mxCreateDoubleMatrix (1, ncol, mxREAL) ;
x = mxGetPr (pargout [1]) ;
for (k = 0 ; k < ncol ; k++)
{
x [k] = Q [k] + 1 ;
}
pargout [2] = mxCreateDoubleMatrix (1, 5, mxREAL) ;
x = mxGetPr (pargout [2]) ;
for (k = 0 ; k < 5 ; k++)
{
x [k] = cp [k] + 1 ;
}
pargout [3] = mxCreateDoubleMatrix (1, 5, mxREAL) ;
x = mxGetPr (pargout [3]) ;
for (k = 0 ; k < 5 ; k++)
{
x [k] = rp [k] + 1 ;
}
mxFree (P) ;
mxFree (Q) ;
}
syntax highlighted by Code2HTML, v. 0.9.1