CHM_r* CHM_rd::rprod_SP(CHM_SP Ut) { static double one[] = {1,0}, zero[] = {0,0}; CHM_rd *ans = new CHM_rd(M_cholmod_allocate_dense(Ut->nrow, A->ncol, Ut->nrow, CHOLMOD_REAL, &c)); M_cholmod_sdmult(Ut, 0/*no transpose*/, one, zero, A, ans->A, &c); return ans; }
CHM_r* CHM_rd::AtA() { static double one[] = {1,0}, zero[] = {0,0}; int nc = (int)A->ncol, nr = (int)A->nrow; CHM_rd *ans = new CHM_rd(M_cholmod_allocate_dense(nc, nc, nc, CHOLMOD_REAL, &c)); if (nc > 0 && nr > 0) F77_CALL(dsyrk)("U", "T", &nc, &nr, one, (double*)A->x, &nr, zero, (double*)((ans->A)->x), &nc); return ans; }
/* Extract dense block x[p,q] of sparse matrix x */ CHM_DN densesubmatrix(CHM_SP x, int *p, int np, int *q, int nq, cholmod_common *c){ CHM_DN ans = M_cholmod_allocate_dense(np,nq,np,CHOLMOD_REAL,c); double *w = malloc(x->nrow*sizeof(double)); int *xi=x->i; int *xp=x->p; double *xx=x->x; double *ansx=ans->x; int col, row; for(int j=0;j<nq;j++){ col=q[j]; /* scatter x[:,col] over w */ for(int i=xp[col];i<xp[col+1];i++){ w[xi[i]]=xx[i]; } /* Copy w[p] to ans[:,col] */ for(int i=j;i<np;i++){ row=p[i]; ansx[i+j*np]=w[row]; } } free(w); return ans; }