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 332, Fri Nov 12 21:04:36 2004 UTC pkg/src/dgCMatrix.c revision 492, Thu Feb 3 14:24:03 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 41  Line 41 
41  SEXP csc_crossprod(SEXP x)  SEXP csc_crossprod(SEXP x)
42  {  {
43      SEXP pslot = GET_SLOT(x, Matrix_pSym),      SEXP pslot = GET_SLOT(x, Matrix_pSym),
44          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("sscMatrix"))), tmp;          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("dsCMatrix"))), tmp;
45      int *xp = INTEGER(pslot),      int *xp = INTEGER(pslot),
46          *xi = INTEGER(GET_SLOT(x, Matrix_iSym));          *xi = INTEGER(GET_SLOT(x, Matrix_iSym));
47      double *xx = REAL(GET_SLOT(x, Matrix_xSym));      double *xx = REAL(GET_SLOT(x, Matrix_xSym));
# Line 49  Line 49 
49      int j, *iVal, ncol = length(pslot) - 1, maxnz, nnz = 0, *pVal;      int j, *iVal, ncol = length(pslot) - 1, maxnz, nnz = 0, *pVal;
50      double *xVal;      double *xVal;
51    
52      SET_SLOT(ans, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(ans, Matrix_factorSym, allocVector(VECSXP, 0));
53        SET_SLOT(ans, Matrix_DimSym, allocVector(INTSXP, 2));
54        SET_SLOT(ans, Matrix_uploSym, mkString("L"));
55      maxnz = (ncol * (ncol + 1))/2;      maxnz = (ncol * (ncol + 1))/2;
56      iVal = Calloc(maxnz, int); xVal = Calloc(maxnz, double);      iVal = Calloc(maxnz, int); xVal = Calloc(maxnz, double);
57      SET_SLOT(ans, Matrix_pSym, allocVector(INTSXP, ncol + 1));      SET_SLOT(ans, Matrix_pSym, allocVector(INTSXP, ncol + 1));
# Line 98  Line 100 
100      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));
101      Memcpy(REAL(GET_SLOT(ans, Matrix_xSym)), xVal, nnz);      Memcpy(REAL(GET_SLOT(ans, Matrix_xSym)), xVal, nnz);
102      Free(iVal); Free(xVal); UNPROTECT(1);      Free(iVal); Free(xVal); UNPROTECT(1);
103      return cscMatrix_set_Dim(ans, ncol);      return dgCMatrix_set_Dim(ans, ncol);
104  }  }
105    
106  SEXP csc_tcrossprod(SEXP x)  SEXP csc_tcrossprod(SEXP x)
107  {  {
108      SEXP pslot = GET_SLOT(x, Matrix_pSym),      SEXP pslot = GET_SLOT(x, Matrix_pSym),
109          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("sscMatrix"))), tmp;          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("dsCMatrix")));
110      int *xp = INTEGER(pslot),      int *xp = INTEGER(pslot),
111          *xi = INTEGER(GET_SLOT(x, Matrix_iSym)),          *xi = INTEGER(GET_SLOT(x, Matrix_iSym)),
112          *dims = INTEGER(GET_SLOT(x, Matrix_DimSym));          *dims = INTEGER(GET_SLOT(x, Matrix_DimSym));
# Line 114  Line 116 
116      int *itmp, *ansp;      int *itmp, *ansp;
117      double *xVal, *xtmp;      double *xVal, *xtmp;
118    
119      SET_SLOT(ans, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(ans, Matrix_factorSym, allocVector(VECSXP, 0));
120        SET_SLOT(ans, Matrix_DimSym, allocVector(INTSXP, 2));
121      ntrip = nrow;               /* number of triplets */      ntrip = nrow;               /* number of triplets */
122      for (j = 0; j < ncol; j++) {      for (j = 0; j < ncol; j++) {
123          int nzj = xp[j+1] - xp[j];          int nzj = xp[j+1] - xp[j];
# Line 154  Line 157 
157      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));
158      Memcpy(INTEGER(GET_SLOT(ans, Matrix_iSym)), itmp, nnz);      Memcpy(INTEGER(GET_SLOT(ans, Matrix_iSym)), itmp, nnz);
159      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));  
160      dims = INTEGER(GET_SLOT(ans, Matrix_DimSym));      dims = INTEGER(GET_SLOT(ans, Matrix_DimSym));
161      dims[0] = dims[1] = nrow;      dims[0] = dims[1] = nrow;
162      Free(itmp); Free(xtmp); Free(iVal); Free(jVal); Free(xVal);      Free(itmp); Free(xtmp); Free(iVal); Free(jVal); Free(xVal);
# Line 191  Line 193 
193      return ans;      return ans;
194  }  }
195    
196  SEXP csc_to_triplet(SEXP x)  SEXP csc_to_dgTMatrix(SEXP x)
197  {  {
198      SEXP      SEXP
199          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("tripletMatrix"))),          ans = PROTECT(NEW_OBJECT(MAKE_CLASS("dgTMatrix"))),
200          dimslot = GET_SLOT(x, Matrix_DimSym),          dimslot = GET_SLOT(x, Matrix_DimSym),
201          islot = GET_SLOT(x, Matrix_iSym),          islot = GET_SLOT(x, Matrix_iSym),
202          pslot = GET_SLOT(x, Matrix_pSym);          pslot = GET_SLOT(x, Matrix_pSym);
# Line 238  Line 240 
240      return ans;      return ans;
241  }  }
242    
243  SEXP csc_to_geMatrix(SEXP x)  SEXP csc_to_dgeMatrix(SEXP x)
244  {  {
245      SEXP ans = PROTECT(NEW_OBJECT(MAKE_CLASS("geMatrix"))),      SEXP ans = PROTECT(NEW_OBJECT(MAKE_CLASS("dgeMatrix"))),
246          Dimslot = GET_SLOT(x, Matrix_DimSym);          Dimslot = GET_SLOT(x, Matrix_DimSym);
247      int *dims = INTEGER(Dimslot),      int *dims = INTEGER(Dimslot),
248          *xp = INTEGER(GET_SLOT(x, Matrix_pSym)),          *xp = INTEGER(GET_SLOT(x, Matrix_pSym)),
# Line 251  Line 253 
253      SET_SLOT(ans, Matrix_DimSym, duplicate(Dimslot));      SET_SLOT(ans, Matrix_DimSym, duplicate(Dimslot));
254      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nrow*ncol));      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nrow*ncol));
255      SET_SLOT(ans, Matrix_rcondSym, allocVector(REALSXP, 0));      SET_SLOT(ans, Matrix_rcondSym, allocVector(REALSXP, 0));
256      SET_SLOT(ans, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(ans, Matrix_factorSym, allocVector(VECSXP, 0));
257      ax = REAL(GET_SLOT(ans, Matrix_xSym));      ax = REAL(GET_SLOT(ans, Matrix_xSym));
258      for (j = 0; j < (nrow * ncol); j++) ax[j] = 0.;      for (j = 0; j < (nrow * ncol); j++) ax[j] = 0.;
259      for (j = 0; j < ncol; j++) {      for (j = 0; j < ncol; j++) {
# Line 266  Line 268 
268    
269  SEXP matrix_to_csc(SEXP A)  SEXP matrix_to_csc(SEXP A)
270  {  {
271      SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("cscMatrix")));      SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("dgCMatrix")));
272      int *adims = INTEGER(getAttrib(A, R_DimSymbol)), j,      int *adims = INTEGER(getAttrib(A, R_DimSymbol)), j,
273          maxnz, nrow, ncol, nnz, *vp, *vi;          maxnz, nrow, ncol, nnz, *vp, *vi;
274    
# Line 275  Line 277 
277      if (!(isMatrix(A) && isReal(A)))      if (!(isMatrix(A) && isReal(A)))
278          error("A must be a numeric matrix");          error("A must be a numeric matrix");
279      nrow = adims[0]; ncol = adims[1];      nrow = adims[0]; ncol = adims[1];
280      SET_SLOT(val, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(val, Matrix_factorSym, allocVector(VECSXP, 0));
281        SET_SLOT(val, Matrix_DimSym, allocVector(INTSXP, 2));
282      SET_SLOT(val, Matrix_pSym, allocVector(INTSXP, ncol + 1));      SET_SLOT(val, Matrix_pSym, allocVector(INTSXP, ncol + 1));
283      vp = INTEGER(GET_SLOT(val, Matrix_pSym));      vp = INTEGER(GET_SLOT(val, Matrix_pSym));
284      maxnz = nrow * ncol;      maxnz = nrow * ncol;
# Line 300  Line 303 
303      Memcpy(REAL(GET_SLOT(val, Matrix_xSym)), vx, nnz);      Memcpy(REAL(GET_SLOT(val, Matrix_xSym)), vx, nnz);
304      Free(vi); Free(vx);      Free(vi); Free(vx);
305      UNPROTECT(1);      UNPROTECT(1);
306      return cscMatrix_set_Dim(val, nrow);      return dgCMatrix_set_Dim(val, nrow);
307  }  }
308    
309    
310  SEXP triplet_to_csc(SEXP triplet)  SEXP dgTMatrix_to_csc(SEXP dgTMatrix)
311  {  {
312      SEXP Tisl = GET_SLOT(triplet, Matrix_iSym);      SEXP Tisl = GET_SLOT(dgTMatrix, Matrix_iSym);
313      int *Ti = INTEGER(Tisl),      int *Ti = INTEGER(Tisl),
314          *Tj = INTEGER(GET_SLOT(triplet, Matrix_jSym)),          *Tj = INTEGER(GET_SLOT(dgTMatrix, Matrix_jSym)),
315          i, nrow, ncol,          i, nrow, ncol,
316          nz = length(Tisl);          nz = length(Tisl);
317    
# Line 318  Line 321 
321          if (Tj[i] > ncol) ncol = Tj[i];          if (Tj[i] > ncol) ncol = Tj[i];
322      }      }
323      return triple_as_SEXP(nrow + 1, ncol + 1, nz, Ti, Tj,      return triple_as_SEXP(nrow + 1, ncol + 1, nz, Ti, Tj,
324                            REAL(GET_SLOT(triplet, Matrix_xSym)),                            REAL(GET_SLOT(dgTMatrix, Matrix_xSym)),
325                            "cscMatrix");                            "dgCMatrix");
326  }  }
327    
328  SEXP csc_getDiag(SEXP x)  SEXP csc_getDiag(SEXP x)
# Line 349  Line 352 
352    
353  SEXP csc_transpose(SEXP x)  SEXP csc_transpose(SEXP x)
354  {  {
355      SEXP      SEXP ans = PROTECT(NEW_OBJECT(MAKE_CLASS("dgCMatrix"))),
         ans = PROTECT(NEW_OBJECT(MAKE_CLASS("cscMatrix"))),  
356          islot = GET_SLOT(x, Matrix_iSym);          islot = GET_SLOT(x, Matrix_iSym);
357      int nnz = length(islot),      int *adims, *xdims = INTEGER(GET_SLOT(x, Matrix_DimSym)),
358          *adims = INTEGER(GET_SLOT(ans, Matrix_DimSym)),          nnz = length(islot);
         *xdims = INTEGER(GET_SLOT(x, Matrix_DimSym));  
359    
360        SET_SLOT(ans, Matrix_DimSym, allocVector(INTSXP, 2));
361        adims = INTEGER(GET_SLOT(ans, Matrix_DimSym));
362      adims[0] = xdims[1]; adims[1] = xdims[0];      adims[0] = xdims[1]; adims[1] = xdims[0];
363      SET_SLOT(ans, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(ans, Matrix_factorSym, allocVector(VECSXP, 0));
364      SET_SLOT(ans, Matrix_pSym, allocVector(INTSXP, xdims[0] + 1));      SET_SLOT(ans, Matrix_pSym, allocVector(INTSXP, xdims[0] + 1));
365      SET_SLOT(ans, Matrix_iSym, allocVector(INTSXP, nnz));      SET_SLOT(ans, Matrix_iSym, allocVector(INTSXP, nnz));
366      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));      SET_SLOT(ans, Matrix_xSym, allocVector(REALSXP, nnz));
# Line 404  Line 407 
407    
408  SEXP csc_col_permute(SEXP x, SEXP perm)  SEXP csc_col_permute(SEXP x, SEXP perm)
409  {  {
410      SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("cscMatrix"))), tmp;      SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("dgCMatrix"))), tmp;
411      int *iperm, *prm, *vi, *vp, *xi, *xp, j, k, ncol, pos;      int *iperm, *prm, *vi, *vp, *xi, *xp, j, k, ncol, pos;
412      double *vx, *xx;      double *vx, *xx;
413    
414      SET_SLOT(val, Matrix_factorization, allocVector(VECSXP, 0));      SET_SLOT(val, Matrix_factorSym, allocVector(VECSXP, 0));
415      tmp = GET_SLOT(x, Matrix_DimSym);      tmp = GET_SLOT(x, Matrix_DimSym);
416      SET_SLOT(val, Matrix_DimSym, duplicate(tmp));      SET_SLOT(val, Matrix_DimSym, duplicate(tmp));
417      ncol = INTEGER(tmp)[1];      ncol = INTEGER(tmp)[1];
# Line 416  Line 419 
419          error("perm must be an integer vector of length %d",          error("perm must be an integer vector of length %d",
420                ncol);                ncol);
421      prm = INTEGER(perm);      prm = INTEGER(perm);
422      iperm = Calloc(ncol, int);      if (!R_ldl_valid_perm(ncol, prm))
     if (!ldl_valid_perm(ncol, prm, iperm))  
423          error("perm is not a valid 0-based permutation");          error("perm is not a valid 0-based permutation");
424        iperm = Calloc(ncol, int);
425      for (j = 0; j < ncol; j++) iperm[prm[j]] = j;      for (j = 0; j < ncol; j++) iperm[prm[j]] = j;
426      tmp = GET_SLOT(x, Matrix_pSym);      tmp = GET_SLOT(x, Matrix_pSym);
427      xp = INTEGER(tmp);      xp = INTEGER(tmp);

Legend:
Removed from v.332  
changed lines
  Added in v.492

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