1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
#include "cs_mex.h"
/* A = cs_frand (n,nel,s) creates an n-by-n sparse matrix consisting of nel
* finite elements, each of which are of size s-by-s with random symmetric
* nonzero pattern, plus the identity matrix.
* See also MATLAB/Demo/private/frand.m */
cs *cs_frand (int n, int nel, int s)
{
int ss = s*s, nz = nel*ss, e, i, j, *P ;
cs *A, *T = cs_spalloc (n, n, nz, 1, 1) ;
if (!T) return (NULL) ;
P = cs_malloc (s, sizeof (int)) ;
if (!P) return (cs_spfree (T)) ;
for (e = 0 ; e < nel ; e++)
{
for (i = 0 ; i < s ; i++) P [i] = rand () % n ;
for (j = 0 ; j < s ; j++)
{
for (i = 0 ; i < s ; i++)
{
cs_entry (T, P [i], P [j], rand () / (double) RAND_MAX) ;
}
}
}
for (i = 0 ; i < n ; i++) cs_entry (T, i, i, 1) ;
A = cs_triplet (T) ;
cs_spfree (T) ;
return (cs_dupl (A) ? A : cs_spfree (A)) ;
}
void mexFunction
(
int nargout,
mxArray *pargout [ ],
int nargin,
const mxArray *pargin [ ]
)
{
int n, nel, s ;
cs *A, *AT ;
if (nargout > 1 || nargin != 3)
{
mexErrMsgTxt ("Usage: C = cs_frand(n,nel,s)") ;
}
n = mxGetScalar (pargin [0]) ;
nel = mxGetScalar (pargin [1]) ;
s = mxGetScalar (pargin [2]) ;
n = CS_MAX (1,n) ;
nel = CS_MAX (1,nel) ;
s = CS_MAX (1,s) ;
AT = cs_frand (n, nel, s) ;
A = cs_transpose (AT, 1) ;
cs_spfree (AT) ;
cs_dropzeros (A) ;
pargout [0] = cs_put_sparse (&A) ;
}
|