/* ========================================================================== */
/* === CHOLMOD/MATLAB/mwrite mexFunction ==================================== */
/* ========================================================================== */
/* Write a matrix to a file in Matrix Market form.
*
* symmetry = mwrite (filename, A, Z, comments_filename)
*
* A can be sparse or full.
*
* If present and non-empty, A and Z must have the same dimension. Z contains
* the explicit zero entries in the matrix (which MATLAB drops). The entries
* of Z appear as explicit zeros in the output file. Z is optional. If it is
* an empty matrix it is ignored. Z must be sparse or empty, if present.
* It is ignored if A is full.
*
* filename is the name of the output file. comments_file is file whose
* contents are include after the Matrix Market header and before the first
* data line. Ignored if an empty string or not present.
*/
#include "cholmod_matlab.h"
#define MAXLEN 1030
/* -------------------------------------------------------------------------- */
/* mwrite mexFunction */
/* -------------------------------------------------------------------------- */
void mexFunction
(
int nargout,
mxArray *pargout [ ],
int nargin,
const mxArray *pargin [ ]
)
{
double dummy = 0 ;
cholmod_sparse Amatrix, Zmatrix, *A, *Z ;
cholmod_dense Xmatrix, *X ;
cholmod_common Common, *cm ;
int arg_z, arg_comments, sym ;
char filename [MAXLEN], comments [MAXLEN] ;
/* ---------------------------------------------------------------------- */
/* start CHOLMOD and set parameters */
/* ---------------------------------------------------------------------- */
cm = &Common ;
cholmod_start (cm) ;
sputil_config (SPUMONI, cm) ;
/* ---------------------------------------------------------------------- */
/* check inputs */
/* ---------------------------------------------------------------------- */
if (nargin < 2 || nargin > 4 || nargout > 1)
{
mexErrMsgTxt ("Usage: mwrite (filename, A, Z, comments_filename)") ;
}
/* ---------------------------------------------------------------------- */
/* get the output filename */
/* ---------------------------------------------------------------------- */
if (!mxIsChar (pargin [0]))
{
mexErrMsgTxt ("first parameter must be a filename") ;
}
mxGetString (pargin [0], filename, MAXLEN) ;
/* ---------------------------------------------------------------------- */
/* get the A matrix (sparse or dense) */
/* ---------------------------------------------------------------------- */
if (!mxIsDouble (pargin [1]))
{
mexErrMsgTxt ("A must be double") ;
}
if (mxIsSparse (pargin [1]))
{
A = sputil_get_sparse (pargin [1], &Amatrix, &dummy, 0) ;
X = NULL ;
}
else
{
X = sputil_get_dense (pargin [1], &Xmatrix, &dummy) ;
A = NULL ;
}
/* ---------------------------------------------------------------------- */
/* determine if the Z matrix and comments_file are present */
/* ---------------------------------------------------------------------- */
if (nargin == 3)
{
if (mxIsChar (pargin [2]))
{
/* mwrite (file, A, comments) */
arg_z = -1 ;
arg_comments = 2 ;
}
else
{
/* mwrite (file, A, Z). Ignore Z if A is full */
arg_z = (A == NULL) ? -1 : 2 ;
arg_comments = -1 ;
}
}
else if (nargin == 4)
{
/* mwrite (file, A, Z, comments). Ignore Z is A is full */
arg_z = (A == NULL) ? -1 : 2 ;
arg_comments = 3 ;
}
else
{
arg_z = -1 ;
arg_comments = -1 ;
}
/* ---------------------------------------------------------------------- */
/* get the Z matrix */
/* ---------------------------------------------------------------------- */
if (arg_z == -1 ||
mxGetM (pargin [arg_z]) == 0 || mxGetN (pargin [arg_z]) == 0)
{
/* A is dense, Z is not present, or Z is empty. Ignore Z. */
Z = NULL ;
}
else
{
/* A is sparse and Z is present and not empty */
if (!mxIsDouble (pargin [arg_z]) || !mxIsSparse (pargin [arg_z]))
{
mexErrMsgTxt ("Z must be sparse and double") ;
}
Z = sputil_get_sparse (pargin [arg_z], &Zmatrix, &dummy, 0) ;
}
/* ---------------------------------------------------------------------- */
/* get the comments filename */
/* ---------------------------------------------------------------------- */
comments [0] = '\0' ;
if (arg_comments != -1)
{
if (!mxIsChar (pargin [arg_comments]))
{
mexErrMsgTxt ("comments filename must be a string") ;
}
mxGetString (pargin [arg_comments], comments, MAXLEN) ;
}
/* ---------------------------------------------------------------------- */
/* write the matrix to the file */
/* ---------------------------------------------------------------------- */
sputil_file = fopen (filename, "w") ;
if (sputil_file == NULL)
{
mexErrMsgTxt ("error opening file") ;
}
if (A != NULL)
{
sym = cholmod_write_sparse (sputil_file, A, Z, comments, cm) ;
}
else
{
sym = cholmod_write_dense (sputil_file, X, comments, cm) ;
}
fclose (sputil_file) ;
sputil_file = NULL ;
if (sym < 0)
{
mexErrMsgTxt ("mwrite failed") ;
}
/* ---------------------------------------------------------------------- */
/* free workspace and return symmetry */
/* ---------------------------------------------------------------------- */
pargout [0] = sputil_put_int (&sym, 1, 0) ;
cholmod_finish (cm) ;
cholmod_print_common (" ", cm) ;
}
syntax highlighted by Code2HTML, v. 0.9.1