SCM

SCM Repository

[matrix] Diff of /branches/Matrix-mer2/src/dgCMatrix.c
ViewVC logotype

Diff of /branches/Matrix-mer2/src/dgCMatrix.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

pkg/src/cscMatrix.c revision 371, Sun Dec 5 13:52:25 2004 UTC pkg/src/dgCMatrix.c revision 534, Tue Feb 8 08:59:31 2005 UTC
# Line 1  Line 1 
1  #include "cscMatrix.h"  #include "dgCMatrix.h"
2    
3  SEXP csc_validate(SEXP x)  SEXP dgCMatrix_validate(SEXP x)
4  {  {
5      SEXP pslot = GET_SLOT(x, Matrix_pSym),      SEXP pslot = GET_SLOT(x, Matrix_pSym),
6          islot = GET_SLOT(x, Matrix_iSym),          islot = GET_SLOT(x, Matrix_iSym),
# Line 14  Line 14 
14    
15      nrow = dims[0];      nrow = dims[0];
16      if (length(islot) != length(xslot))      if (length(islot) != length(xslot))
17          return ScalarString(mkChar("lengths of slots i and x must match"));          return mkString("lengths of slots i and x must match");
18      if (length(pslot) <= 0)      if (length(pslot) <= 0)
19          return ScalarString(mkChar("slot p must have length > 0"));          return mkString("slot p must have length > 0");
20      if (xp[0] != 0)      if (xp[0] != 0)
21          return ScalarString(mkChar("first element of slot p must be zero"));          return mkString("first element of slot p must be zero");
22      if (length(islot) != xp[ncol])      if (length(islot) != xp[ncol])
23          return ScalarString(          return mkString("last element of slot p must match length of slots i and x");
             mkChar(  
                 "last element of slot p must match length of slots i and x"));  
24      for (j = 0; j < ncol; j++) {      for (j = 0; j < ncol; j++) {
25          if (xp[j] > xp[j+1])          if (xp[j] > xp[j+1])
26              return ScalarString(mkChar("slot p must be non-decreasing"));              return mkString("slot p must be non-decreasing");
27      }      }
28      for (j = 0; j < length(islot); j++) {      for (j = 0; j < length(islot); j++) {
29          if (xi[j] < 0 || xi[j] >= nrow)          if (xi[j] < 0 || xi[j] >= nrow)
30              return ScalarString(              return mkString("all row indices must be between 0 and nrow-1");
                 mkChar("all row indices must be between 0 and nrow-1"));  
31      }      }
32      if (csc_unsorted_columns(ncol, xp, xi)) {      if (csc_unsorted_columns(ncol, xp, xi)) {
33          csc_sort_columns(ncol, xp, xi, REAL(xslot));          csc_sort_columns(ncol, xp, xi, REAL(xslot));
# Line 41  Line 38 
38  SEXP csc_crossprod(SEXP x)  SEXP csc_crossprod(SEXP x)
39  {  {
40      SEXP pslot = GET_SLOT(x, Matrix_pSym),      SEXP pslot = GET_SLOT(x, Matrix_pSym),
41          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("sscMatrix"))), tmp;          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("dsCMatrix"))), tmp;
42      int *xp = INTEGER(pslot),      int *xp = INTEGER(pslot),
43          *xi = INTEGER(GET_SLOT(x, Matrix_iSym));          *xi = INTEGER(GET_SLOT(x, Matrix_iSym));
44      double *xx = REAL(GET_SLOT(x, Matrix_xSym));      double *xx = REAL(GET_SLOT(x, Matrix_xSym));
# Line 49  Line 46 
46      int j, *iVal, ncol = length(pslot) - 1, maxnz, nnz = 0, *pVal;      int j, *iVal, ncol = length(pslot) - 1, maxnz, nnz = 0, *pVal;
47      double *xVal;      double *xVal;
48    
49      SET_SLOT(ans, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(ans, Matrix_factorSym, allocVector(VECSXP, 0));
50        SET_SLOT(ans, Matrix_DimSym, allocVector(INTSXP, 2));
51        SET_SLOT(ans, Matrix_uploSym, mkString("L"));
52      maxnz = (ncol * (ncol + 1))/2;      maxnz = (ncol * (ncol + 1))/2;
53      iVal = Calloc(maxnz, int); xVal = Calloc(maxnz, double);      iVal = Calloc(maxnz, int); xVal = Calloc(maxnz, double);
54      SET_SLOT(ans, Matrix_pSym, allocVector(INTSXP, ncol + 1));      SET_SLOT(ans, Matrix_pSym, allocVector(INTSXP, ncol + 1));
# Line 98  Line 97 
97      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));
98      Memcpy(REAL(GET_SLOT(ans, Matrix_xSym)), xVal, nnz);      Memcpy(REAL(GET_SLOT(ans, Matrix_xSym)), xVal, nnz);
99      Free(iVal); Free(xVal); UNPROTECT(1);      Free(iVal); Free(xVal); UNPROTECT(1);
100      return cscMatrix_set_Dim(ans, ncol);      return dgCMatrix_set_Dim(ans, ncol);
101  }  }
102    
103  SEXP csc_tcrossprod(SEXP x)  SEXP csc_tcrossprod(SEXP x)
104  {  {
105      SEXP pslot = GET_SLOT(x, Matrix_pSym),      SEXP pslot = GET_SLOT(x, Matrix_pSym),
106          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("sscMatrix")));          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("dsCMatrix")));
107      int *xp = INTEGER(pslot),      int *xp = INTEGER(pslot),
108          *xi = INTEGER(GET_SLOT(x, Matrix_iSym)),          *xi = INTEGER(GET_SLOT(x, Matrix_iSym)),
109          *dims = INTEGER(GET_SLOT(x, Matrix_DimSym));          *dims = INTEGER(GET_SLOT(x, Matrix_DimSym));
# Line 114  Line 113 
113      int *itmp, *ansp;      int *itmp, *ansp;
114      double *xVal, *xtmp;      double *xVal, *xtmp;
115    
116      SET_SLOT(ans, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(ans, Matrix_factorSym, allocVector(VECSXP, 0));
117        SET_SLOT(ans, Matrix_DimSym, allocVector(INTSXP, 2));
118      ntrip = nrow;               /* number of triplets */      ntrip = nrow;               /* number of triplets */
119      for (j = 0; j < ncol; j++) {      for (j = 0; j < ncol; j++) {
120          int nzj = xp[j+1] - xp[j];          int nzj = xp[j+1] - xp[j];
# Line 149  Line 149 
149      triplet_to_col(nrow, nrow, ntrip, iVal, jVal, xVal,      triplet_to_col(nrow, nrow, ntrip, iVal, jVal, xVal,
150                     ansp, itmp, xtmp);                     ansp, itmp, xtmp);
151      nnz = ansp[nrow];      nnz = ansp[nrow];
152      SET_SLOT(ans, Matrix_uploSym, ScalarString(mkChar("L")));      SET_SLOT(ans, Matrix_uploSym, mkString("L"));
153      SET_SLOT(ans, Matrix_iSym, allocVector(INTSXP, nnz));      SET_SLOT(ans, Matrix_iSym, allocVector(INTSXP, nnz));
154      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));
155      Memcpy(INTEGER(GET_SLOT(ans, Matrix_iSym)), itmp, nnz);      Memcpy(INTEGER(GET_SLOT(ans, Matrix_iSym)), itmp, nnz);
156      Memcpy(REAL(GET_SLOT(ans, Matrix_xSym)), xtmp, nnz);      Memcpy(REAL(GET_SLOT(ans, Matrix_xSym)), xtmp, nnz);
     SET_SLOT(ans, Matrix_DimSym, allocVector(INTSXP, 2));  
157      dims = INTEGER(GET_SLOT(ans, Matrix_DimSym));      dims = INTEGER(GET_SLOT(ans, Matrix_DimSym));
158      dims[0] = dims[1] = nrow;      dims[0] = dims[1] = nrow;
159      Free(itmp); Free(xtmp); Free(iVal); Free(jVal); Free(xVal);      Free(itmp); Free(xtmp); Free(iVal); Free(jVal); Free(xVal);
# Line 191  Line 190 
190      return ans;      return ans;
191  }  }
192    
193  SEXP csc_to_triplet(SEXP x)  SEXP csc_to_dgTMatrix(SEXP x)
194  {  {
195      SEXP      SEXP
196          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("tripletMatrix"))),          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("dgTMatrix"))),
197          dimslot = GET_SLOT(x, Matrix_DimSym),          dimslot = GET_SLOT(x, Matrix_DimSym),
198          islot = GET_SLOT(x, Matrix_iSym),          islot = GET_SLOT(x, Matrix_iSym),
199          pslot = GET_SLOT(x, Matrix_pSym);          pslot = GET_SLOT(x, Matrix_pSym);
# Line 238  Line 237 
237      return ans;      return ans;
238  }  }
239    
240  SEXP csc_to_geMatrix(SEXP x)  SEXP csc_to_dgeMatrix(SEXP x)
241  {  {
242      SEXP ans = PROTECT(NEW_OBJECT(MAKE_CLASS("geMatrix"))),      SEXP ans = PROTECT(NEW_OBJECT(MAKE_CLASS("dgeMatrix"))),
243          Dimslot = GET_SLOT(x, Matrix_DimSym);          Dimslot = GET_SLOT(x, Matrix_DimSym);
244      int *dims = INTEGER(Dimslot),      int *dims = INTEGER(Dimslot),
245          *xp = INTEGER(GET_SLOT(x, Matrix_pSym)),          *xp = INTEGER(GET_SLOT(x, Matrix_pSym)),
# Line 251  Line 250 
250      SET_SLOT(ans, Matrix_DimSym, duplicate(Dimslot));      SET_SLOT(ans, Matrix_DimSym, duplicate(Dimslot));
251      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nrow*ncol));      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nrow*ncol));
252      SET_SLOT(ans, Matrix_rcondSym, allocVector(REALSXP, 0));      SET_SLOT(ans, Matrix_rcondSym, allocVector(REALSXP, 0));
253      SET_SLOT(ans, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(ans, Matrix_factorSym, allocVector(VECSXP, 0));
254      ax = REAL(GET_SLOT(ans, Matrix_xSym));      ax = REAL(GET_SLOT(ans, Matrix_xSym));
255      for (j = 0; j < (nrow * ncol); j++) ax[j] = 0.;      for (j = 0; j < (nrow * ncol); j++) ax[j] = 0.;
256      for (j = 0; j < ncol; j++) {      for (j = 0; j < ncol; j++) {
# Line 266  Line 265 
265    
266  SEXP matrix_to_csc(SEXP A)  SEXP matrix_to_csc(SEXP A)
267  {  {
268      SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("cscMatrix")));      SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("dgCMatrix")));
269      int *adims = INTEGER(getAttrib(A, R_DimSymbol)), j,      int *adims = INTEGER(getAttrib(A, R_DimSymbol)), j,
270          maxnz, nrow, ncol, nnz, *vp, *vi;          maxnz, nrow, ncol, nnz, *vp, *vi;
271    
# Line 275  Line 274 
274      if (!(isMatrix(A) && isReal(A)))      if (!(isMatrix(A) && isReal(A)))
275          error("A must be a numeric matrix");          error("A must be a numeric matrix");
276      nrow = adims[0]; ncol = adims[1];      nrow = adims[0]; ncol = adims[1];
277      SET_SLOT(val, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(val, Matrix_factorSym, allocVector(VECSXP, 0));
278        SET_SLOT(val, Matrix_DimSym, allocVector(INTSXP, 2));
279      SET_SLOT(val, Matrix_pSym, allocVector(INTSXP, ncol + 1));      SET_SLOT(val, Matrix_pSym, allocVector(INTSXP, ncol + 1));
280      vp = INTEGER(GET_SLOT(val, Matrix_pSym));      vp = INTEGER(GET_SLOT(val, Matrix_pSym));
281      maxnz = nrow * ncol;      maxnz = nrow * ncol;
# Line 300  Line 300 
300      Memcpy(REAL(GET_SLOT(val, Matrix_xSym)), vx, nnz);      Memcpy(REAL(GET_SLOT(val, Matrix_xSym)), vx, nnz);
301      Free(vi); Free(vx);      Free(vi); Free(vx);
302      UNPROTECT(1);      UNPROTECT(1);
303      return cscMatrix_set_Dim(val, nrow);      return dgCMatrix_set_Dim(val, nrow);
304  }  }
305    
306    
307  SEXP triplet_to_csc(SEXP triplet)  SEXP dgTMatrix_to_csc(SEXP dgTMatrix)
308  {  {
309      SEXP Tisl = GET_SLOT(triplet, Matrix_iSym);      SEXP Tisl = GET_SLOT(dgTMatrix, Matrix_iSym);
310      int *Ti = INTEGER(Tisl),      int *Ti = INTEGER(Tisl),
311          *Tj = INTEGER(GET_SLOT(triplet, Matrix_jSym)),          *Tj = INTEGER(GET_SLOT(dgTMatrix, Matrix_jSym)),
312          i, nrow, ncol,          i, nrow, ncol,
313          nz = length(Tisl);          nz = length(Tisl);
314    
# Line 318  Line 318 
318          if (Tj[i] > ncol) ncol = Tj[i];          if (Tj[i] > ncol) ncol = Tj[i];
319      }      }
320      return triple_as_SEXP(nrow + 1, ncol + 1, nz, Ti, Tj,      return triple_as_SEXP(nrow + 1, ncol + 1, nz, Ti, Tj,
321                            REAL(GET_SLOT(triplet, Matrix_xSym)),                            REAL(GET_SLOT(dgTMatrix, Matrix_xSym)),
322                            "cscMatrix");                            "dgCMatrix");
323  }  }
324    
325  SEXP csc_getDiag(SEXP x)  SEXP csc_getDiag(SEXP x)
# Line 349  Line 349 
349    
350  SEXP csc_transpose(SEXP x)  SEXP csc_transpose(SEXP x)
351  {  {
352      SEXP      SEXP ans = PROTECT(NEW_OBJECT(MAKE_CLASS("dgCMatrix"))),
         ans = PROTECT(NEW_OBJECT(MAKE_CLASS("cscMatrix"))),  
353          islot = GET_SLOT(x, Matrix_iSym);          islot = GET_SLOT(x, Matrix_iSym);
354      int nnz = length(islot),      int *adims, *xdims = INTEGER(GET_SLOT(x, Matrix_DimSym)),
355          *adims = INTEGER(GET_SLOT(ans, Matrix_DimSym)),          nnz = length(islot);
         *xdims = INTEGER(GET_SLOT(x, Matrix_DimSym));  
356    
357        SET_SLOT(ans, Matrix_DimSym, allocVector(INTSXP, 2));
358        adims = INTEGER(GET_SLOT(ans, Matrix_DimSym));
359      adims[0] = xdims[1]; adims[1] = xdims[0];      adims[0] = xdims[1]; adims[1] = xdims[0];
360      SET_SLOT(ans, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(ans, Matrix_factorSym, allocVector(VECSXP, 0));
361      SET_SLOT(ans, Matrix_pSym, allocVector(INTSXP, xdims[0] + 1));      SET_SLOT(ans, Matrix_pSym, allocVector(INTSXP, xdims[0] + 1));
362      SET_SLOT(ans, Matrix_iSym, allocVector(INTSXP, nnz));      SET_SLOT(ans, Matrix_iSym, allocVector(INTSXP, nnz));
363      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));
# Line 404  Line 404 
404    
405  SEXP csc_col_permute(SEXP x, SEXP perm)  SEXP csc_col_permute(SEXP x, SEXP perm)
406  {  {
407      SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("cscMatrix"))), tmp;      SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("dgCMatrix"))), tmp;
408      int *iperm, *prm, *vi, *vp, *xi, *xp, j, k, ncol, pos;      int *iperm, *prm, *vi, *vp, *xi, *xp, j, k, ncol, pos;
409      double *vx, *xx;      double *vx, *xx;
410    
411      SET_SLOT(val, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(val, Matrix_factorSym, allocVector(VECSXP, 0));
412      tmp = GET_SLOT(x, Matrix_DimSym);      tmp = GET_SLOT(x, Matrix_DimSym);
413      SET_SLOT(val, Matrix_DimSym, duplicate(tmp));      SET_SLOT(val, Matrix_DimSym, duplicate(tmp));
414      ncol = INTEGER(tmp)[1];      ncol = INTEGER(tmp)[1];

Legend:
Removed from v.371  
changed lines
  Added in v.534

root@r-forge.r-project.org
ViewVC Help
Powered by ViewVC 1.0.0  
Thanks to:
Vienna University of Economics and Business Powered By FusionForge