SEXP dsyMatrix_as_matrix(SEXP from) { int n = INTEGER(GET_SLOT(from, Matrix_DimSym))[0]; SEXP val = PROTECT(allocMatrix(REALSXP, n, n)); make_symmetric(Memcpy(REAL(val), REAL(GET_SLOT(from, Matrix_xSym)), n * n), from, n); setAttrib(val, R_DimNamesSymbol, GET_SLOT(from, Matrix_DimNamesSym)); UNPROTECT(1); return val; }
MatrixType cholesky_invert(MatrixType a) { // factorize int info = potrf(a); if (info != 0) { throw std::runtime_error("potrf failed in cholesky_invert " + std::to_string(info)); } potri(a); return make_symmetric(a); }
SEXP dsyMatrix_as_dgeMatrix(SEXP from) { SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("dgeMatrix"))), rcondSym = Matrix_rcondSym; SET_SLOT(val, Matrix_rcondSym, allocVector(REALSXP, 0)); SET_SLOT(val, Matrix_factorSym, allocVector(VECSXP, 0)); SET_SLOT(val, rcondSym, duplicate(GET_SLOT(from, rcondSym))); SET_SLOT(val, Matrix_xSym, duplicate(GET_SLOT(from, Matrix_xSym))); SET_SLOT(val, Matrix_DimSym, duplicate(GET_SLOT(from, Matrix_DimSym))); make_symmetric(REAL(GET_SLOT(val, Matrix_xSym)), from, INTEGER(GET_SLOT(val, Matrix_DimSym))[0]); UNPROTECT(1); return val; }