https://github.com/cran/Matrix
Tip revision: 3cf4eb07f23da2319bcd93802610073340952858 authored by Doug and Martin on 10 June 2009, 00:00:00 UTC
version 0.999375-29
version 0.999375-29
Tip revision: 3cf4eb0
lgCMatrix.c
#include "lgCMatrix.h"
#include "dgCMatrix.h"
/* validate: -> xCMatrix_validate() in ./dgCMatrix.c */
SEXP lcsc_to_matrix(SEXP x)
{
SEXP ans, pslot = GET_SLOT(x, Matrix_pSym),
dn = GET_SLOT(x, Matrix_DimNamesSym);
int j, ncol = length(pslot) - 1,
nrow = INTEGER(GET_SLOT(x, Matrix_DimSym))[0],
*xp = INTEGER(pslot),
*xi = INTEGER(GET_SLOT(x, Matrix_iSym));
int *xx = LOGICAL(GET_SLOT(x, Matrix_xSym)), *ax;
ax = LOGICAL(ans = PROTECT(allocMatrix(LGLSXP, nrow, ncol)));
for (j = 0; j < (nrow * ncol); j++) ax[j] = 0;
for (j = 0; j < ncol; j++) {
int ind;
for (ind = xp[j]; ind < xp[j+1]; ind++)
ax[j * nrow + xi[ind]] = xx[ind];
}
if (!(isNull(VECTOR_ELT(dn,0)) && isNull(VECTOR_ELT(dn,1))))
setAttrib(ans, R_DimNamesSymbol, duplicate(dn));
UNPROTECT(1);
return ans;
}
/* as above, '1' instead of 'x' slot: */
SEXP ncsc_to_matrix(SEXP x)
{
SEXP ans, pslot = GET_SLOT(x, Matrix_pSym),
dn = GET_SLOT(x, Matrix_DimNamesSym);
int j, ncol = length(pslot) - 1,
nrow = INTEGER(GET_SLOT(x, Matrix_DimSym))[0],
*xp = INTEGER(pslot),
*xi = INTEGER(GET_SLOT(x, Matrix_iSym));
int *ax;
ax = LOGICAL(ans = PROTECT(allocMatrix(LGLSXP, nrow, ncol)));
for (j = 0; j < (nrow * ncol); j++) ax[j] = 0;
for (j = 0; j < ncol; j++) {
int ind;
for (ind = xp[j]; ind < xp[j+1]; ind++)
ax[j * nrow + xi[ind]] = 1;
}
if (!(isNull(VECTOR_ELT(dn,0)) && isNull(VECTOR_ELT(dn,1))))
setAttrib(ans, R_DimNamesSymbol, duplicate(dn));
UNPROTECT(1);
return ans;
}
#ifdef _NEED_logical_to_csc_FIRST_
/* very parallel to matrix_to_csc() in ./dgCMatrix.c */
SEXP matrix_to_lcsc(SEXP A)
{
if (!(isMatrix(A) && isLogical(A)))
error(_("A must be a logical matrix"));
return logical_to_csc(LOGICAL(A),
INTEGER(getAttrib(A, R_DimSymbol)));
}
#endif