/** * Extract the diagonal entries from *triangular* Csparse matrix __or__ a * cholmod_sparse factor (LDL = TRUE). * * @param pslot 'p' (column pointer) slot of Csparse matrix/factor * @param xslot 'x' (non-zero entries) slot of Csparse matrix/factor * @param perm_slot 'perm' (= permutation vector) slot of corresponding CHMfactor; * only used for "diagBack" * @param resultKind a (SEXP) string indicating which kind of result is desired. * * @return a SEXP, either a (double) number or a length n-vector of diagonal entries */ SEXP diag_tC(SEXP pslot, SEXP xslot, SEXP perm_slot, SEXP resultKind) { int n = length(pslot) - 1, /* n = ncol(.) = nrow(.) */ *x_p = INTEGER(pslot), *perm = INTEGER(perm_slot); double *x_x = REAL(xslot); /* ^^^^^^ ^^^^ FIXME[Generalize] to INTEGER(.) / LOGICAL(.) / ... xslot !*/ return diag_tC_ptr(n, x_p, x_x, perm, resultKind); }
/** * Fast version of getting at the diagonal matrix D of the * (generalized) simplicial Cholesky LDL' decomposition of a * (sparse symmetric) dsCMatrix. * * @param Ap symmetric CsparseMatrix * @param permP logical indicating if permutation is allowed * @param resultKind an (SEXP) string indicating which kind of result * is desired. * * @return SEXP containing either the vector diagonal entries of D, * or just sum_i D[i], prod_i D[i] or sum_i log(D[i]). */ SEXP dsCMatrix_LDL_D(SEXP Ap, SEXP permP, SEXP resultKind) { CHM_FR L; SEXP ans; int c_pr = c.print; c.print = 0;/* stop CHOLMOD printing; we cannot suppress it (in R), and have error handler already */ L = internal_chm_factor(Ap, asLogical(permP), /*LDL*/ 1, /*super*/0, /*Imult*/0.); c.print = c_pr; ans = PROTECT(diag_tC_ptr(L->n, L->p, L->x, L->Perm, resultKind)); cholmod_l_free_factor(&L, &c); UNPROTECT(1); return(ans); }