Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
/* 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;
}