Rcpp NumericMatrix - how to erase a row / column?

后端 未结 2 1791
名媛妹妹
名媛妹妹 2020-12-17 21:40

A novice question as I learn the Rcpp classes / data structures: Is there a member function to erase a row / column for an object of class Rcpp::NumericMatrix?

相关标签:
2条回答
  • 2020-12-17 22:06

    Yes, both of these do work (fixing my typos above). I got a conversion error trying to replace int iter with Rcpp::NumericMatrix::iterator iter though. Any fix for this?

    Note that we do not need the row_erase(NumericMatrix& x, int& ref) since this is a special case of row_erase(NumericMatrix& x, IntegerVector& ref).

    NumericMatrix row_erase (NumericMatrix& x, IntegerVector& rowID) {
      rowID = rowID.sort();
    
      NumericMatrix x2(Dimension(x.nrow()- rowID.size(), x.ncol()));
      int iter = 0; 
      int del = 1; // to count deleted elements
      for (int i = 0; i < x.nrow(); i++) {
        if (i != rowID[del - 1]) {
          x2.row(iter) = x.row(i);
          iter++;
        } else {
          del++;
        }
      }
      return x2;
    }
    
    NumericMatrix col_erase (NumericMatrix& x, IntegerVector& colID) {
      colID = colID.sort();
    
      NumericMatrix x2(Dimension(x.nrow(), x.ncol()- colID.size()));
      int iter = 0; 
      int del = 1; 
      for (int i = 0; i < x.ncol(); i++) {
        if (i != colID[del - 1]) {
          x2.col(iter) = x.column(i);
          iter++;
        } else {
          del++;
        }
      }
      return x2;
    }
    
    0 讨论(0)
  • 2020-12-17 22:10

    How about using RcppArmadillo? I think the intention of the code would be much clearer...

    #include <RcppArmadillo.h>
    // [[Rcpp::depends(RcppArmadillo)]]
    
    using namespace arma;
    
    // [[Rcpp::export]]
    mat sub1( mat x, uword e) {
      x.shed_col(e-1);
      x.shed_row(e-1);
      return x;
    }
    
    /*** R
    sub1( matrix(1:9,3), 2 )
    */
    

    > sub1( matrix(1:9,3), 2 )
         [,1] [,2]
    [1,]    1    7
    [2,]    3    9
    
    0 讨论(0)
提交回复
热议问题