1 // -----------------------------------------------------------------------------
2 // sfmult mexFunction
3 // -----------------------------------------------------------------------------
4 
5 // y = A*x and variants.  Either A or x can be sparse, the other must be full
6 
7 #include "sfmult.h"
8 
mexFunction(int nargout,mxArray * pargout[],int nargin,const mxArray * pargin[])9 void mexFunction
10 (
11     int nargout,
12     mxArray *pargout [ ],
13     int nargin,
14     const mxArray *pargin [ ]
15 )
16 {
17     const mxArray *A, *X ;
18     int at, ac, xt, xc, yt, yc, do_sparse_times_full ;
19 
20     // -------------------------------------------------------------------------
21     // get inputs
22     // -------------------------------------------------------------------------
23 
24     if (nargin < 2 || nargin > 8 || nargout > 1)
25     {
26 	mexErrMsgTxt ("Usage: y = sfmult (A,x, at,ac, xt,xc, yt,yc)") ;
27     }
28 
29     if (mxIsSparse (pargin [0]))
30     {
31 	// sfmult (A,x) will do A*x where A is sparse and x is full
32 	do_sparse_times_full = 1 ;
33 	A = pargin [0] ;
34 	X = pargin [1] ;
35     }
36     else
37     {
38 	// sfmult (x,A) will do x*A where A is sparse and x is full
39 	do_sparse_times_full = 0 ;
40 	A = pargin [1] ;
41 	X = pargin [0] ;
42     }
43 
44     if (!mxIsSparse (A) || mxIsSparse (X))
45     {
46 	mexErrMsgTxt ("one matrix must be sparse and the other full") ;
47     }
48 
49     at = (nargin > 2) ? mxGetScalar (pargin [2]) : 0 ;
50     ac = (nargin > 3) ? mxGetScalar (pargin [3]) : 0 ;
51     xt = (nargin > 4) ? mxGetScalar (pargin [4]) : 0 ;
52     xc = (nargin > 5) ? mxGetScalar (pargin [5]) : 0 ;
53     yt = (nargin > 6) ? mxGetScalar (pargin [6]) : 0 ;
54     yc = (nargin > 7) ? mxGetScalar (pargin [7]) : 0 ;
55 
56     // -------------------------------------------------------------------------
57     // y = A*x or x*A or variants
58     // -------------------------------------------------------------------------
59 
60     pargout [0] = do_sparse_times_full ?
61 	sfmult (A, X, at, ac, xt, xc, yt, yc) :
62 	fsmult (A, X, at, ac, xt, xc, yt, yc) ;
63 
64     // (TO DO) convert y to real if imag(y) is all zero
65 }
66