6 SEXP to = NULL, length = NULL, i = NULL, x = NULL;
7 R_xlen_t n_ = XLENGTH(from);
9#define V2SPV(_KIND_, _NZ_, \
10 _CTYPE1_, _SEXPTYPE1_, _PTR1_, \
11 _CTYPE2_, _SEXPTYPE2_, _PTR2_) \
13 PROTECT(to = newObject(#_KIND_ "sparseVector")); \
14 _CTYPE1_ *py = _PTR1_(from); \
15 for (k = 0; k < n; ++k) \
18 PROTECT(i = allocVector(_SEXPTYPE2_, nnz)); \
19 PROTECT(x = allocVector(_SEXPTYPE1_, nnz)); \
20 _CTYPE2_ *pi = _PTR2_(i); \
21 _CTYPE1_ *px = _PTR1_(x); \
22 for (k = 0; k < n; ++k) { \
24 *(pi++) = (_CTYPE2_) (k + 1); \
30#define V2SPV_CASES(_CTYPE2_, _SEXPTYPE2_, _PTR2_) \
32 switch (TYPEOF(from)) { \
34 V2SPV(l, ISNZ_LOGICAL, int, LGLSXP, LOGICAL, \
35 _CTYPE2_, _SEXPTYPE2_, _PTR2_); \
38 V2SPV(i, ISNZ_INTEGER, int, INTSXP, INTEGER, \
39 _CTYPE2_, _SEXPTYPE2_, _PTR2_); \
42 V2SPV(d, ISNZ_REAL, double, REALSXP, REAL, \
43 _CTYPE2_, _SEXPTYPE2_, _PTR2_); \
46 V2SPV(z, ISNZ_COMPLEX, Rcomplex, CPLXSXP, COMPLEX, \
47 _CTYPE2_, _SEXPTYPE2_, _PTR2_); \
50 ERROR_INVALID_TYPE(from, __func__); \
56 int k, n = (int) n_, nnz = 0;
57 PROTECT(length = ScalarInteger(n));
60 R_xlen_t k, n = n_, nnz = 0;
61 PROTECT(length = ScalarReal((
double) n));
79 int ivalid = R_check_class_etc(from,
valid);
85 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
90 error(
_(
"%s length cannot exceed %s"),
"sparseVector",
"2^53");
96 char vcl[] =
".sparseVector";
101 int *pp = INTEGER(p), nnz = (
cl[2] ==
'C') ? pp[n] : pp[m];
105 PROTECT(vlength = ScalarInteger(m * n));
106 PROTECT(vi = allocVector(INTSXP, nnz));
108 PROTECT(vlength = ScalarReal((
double) m * n));
109 PROTECT(vi = allocVector(REALSXP, nnz));
116 int *pi = INTEGER(i), k, kend, j;
117 if (TYPEOF(vi) == INTSXP) {
118 int *pvi = INTEGER(vi), mj1a = 1;
119 for (j = 0, k = 0; j < n; ++j) {
122 *(pvi++) = mj1a + *(pi++);
128 double *pvi = REAL(vi), mj1a = 1.0, m_ = (double) m;
129 for (j = 0, k = 0; j < n; ++j) {
132 *(pvi++) = mj1a + (
double) *(pi++);
146 int *pj = INTEGER(j), k, kend, tmp, *work;
148 for (k = 0; k < nnz; ++k)
151 for (k = 0; k < n; ++k) {
157#define R2SPV(_CTYPE_, _PTR_, _MASK_) \
159 _MASK_(_CTYPE_ *px = _PTR_(x )); \
160 _MASK_(_CTYPE_ *pvx = _PTR_(vx)); \
161 if (TYPEOF(vi) == INTSXP) { \
162 int *pvi = INTEGER(vi), i; \
164 for (i = 1; i <= m; i += 1) { \
167 pvi[work[pj[k]]] = m * pj[k] + i; \
168 _MASK_(pvx[work[pj[k]]] = px[k]); \
173 double *pvi = REAL(vi), i_, m_ = (double) m; \
175 for (i_ = 1.0; i_ <= m_; i_ += 1.0) { \
178 pvi[work[pj[k]]] = m_ * pj[k] + i_; \
179 _MASK_(pvx[work[pj[k]]] = px[k]); \
190 vx = PROTECT(allocVector(TYPEOF(x), XLENGTH(x)));