123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- #include "mex.h"
-
-
- void attributesSimilarity(mwIndex* ir, mwIndex* jc, double* commonAtts,
- double *numAtts, mwSize n, double threshold,
- mwIndex* ir_out, mwIndex* jc_out, double* outSimAtts)
- {
-
- double numTotalAtts, numCommon;
- int currCol = 0, startIdx, stopIdx, i, j, currRow;
- int nnz_in = jc[n];
- int nnz_out = 0;
-
- printf("attributesSimilarity: nnz = %d\n", nnz_in);
-
- for (currCol = 0; currCol < n; currCol++)
- {
- jc_out[currCol] = nnz_out;
-
- startIdx = jc[currCol];
- stopIdx = jc[currCol + 1];
-
- for(i = startIdx; i < stopIdx; i++)
- {
- currRow = ir[i];
- numCommon = commonAtts[i];
- numTotalAtts = numAtts[currRow]+numAtts[currCol]-numCommon;
- // // debugging
- // if (currCol<30 && currRow<30) {
- // printf("(i,j)=(%d,%d): common=%f, total=%f\n", currRow,currCol,numCommon,numTotalAtts);
- // }
- if (numTotalAtts > 0 && numCommon/numTotalAtts > threshold)
- {
- outSimAtts[nnz_out] = numCommon/numTotalAtts;
- ir_out[nnz_out] = ir[i];
- nnz_out++;
- // } else
- // {
- // outSimAtts[i] = 0;
- // ir_out[i] = ir[i];
- }
- }
-
-
- }
- jc_out[n] = nnz_out;
-
- }
-
-
- /* The gateway function
- //this function accepts two parameters:
- //1. a sparse affinity matrix (should be the number of common attributes between nodes i and j
- //2. an array with the number of attributes of each node
- */
- void mexFunction( int nlhs, mxArray *plhs[],
- int nrhs, const mxArray *prhs[])
- {
- /* variable declarations here */
- mwIndex* ir;
- mwIndex* jc;
- double* commonAtts;
- double* numAtts;
- mwSize n,m,n2,m2;
- double threshold;
-
-
- mwIndex* ir_out;
- mwIndex* jc_out;
- double* outSimAtts;
- int i;
-
-
- printf("nlhs = %d, nrhs = %d\n", nlhs, nrhs);
-
- /* Check for the correct number of inputs */
- if(nrhs != 3){
- mexErrMsgIdAndTxt( "MATLAB:attributesSimilarity:wrongrhs",
- "Wrong number of input arguments.");
- }
-
- commonAtts = mxGetPr(prhs[0]); /* pointer to first input */
- ir = mxGetIr(prhs[0]);
- jc = mxGetJc(prhs[0]);
-
- numAtts = mxGetPr(prhs[1]); /* pointer to second input */
-
- threshold = mxGetScalar(prhs[2]); /* pointer to thrid input matrix */
- printf("threshold = %f\n", threshold);
-
- /* dimensions of input matrices */
- m = mxGetM(prhs[0]);
- n = mxGetN(prhs[0]);
- m2 = mxGetM(prhs[1]);
- n2 = mxGetN(prhs[1]);
-
- printf("dimensions: m=%d, n=%d, m2=%d, n2=%d\n", m, n, m2, n2);
- if (m != m2) {
- mexErrMsgIdAndTxt("MATLAB:attributesSimilarity:matchdims",
- "Inner dimensions of matrices do not match.");
- }
- if (n != m) {
- mexErrMsgIdAndTxt("MATLAB:attributesSimilarity:square",
- "Function requires input matrix 1 must be square.");
- }
- if (n2 != 1) {
- mexErrMsgIdAndTxt("MATLAB:attributesSimilarity:zerodivide",
- "Function requires input matrix 2 must be a column vector.");
- }
-
- plhs[0] = mxCreateSparse(n,n, jc[n], mxREAL);
- outSimAtts = mxGetPr(plhs[0]);
- ir_out = mxGetIr(plhs[0]);
- jc_out = mxGetJc(plhs[0]);
-
- attributesSimilarity(ir, jc, commonAtts, numAtts, n, threshold, ir_out, jc_out, outSimAtts);
-
-
- }
-
-
|