Elementwise matrix multiplication: R versus Rcpp (How to speed this code up?)

后端 未结 3 1139
北荒
北荒 2021-02-03 14:30

I am new to C++ programming (using Rcpp for seamless integration into R), and I would appreciate some advice on how to speed up some calcu

3条回答
  •  花落未央
    2021-02-03 15:28

    For starters, I'd write the Armadillo version (interface) as

    #include 
    // [[Rcpp::depends(RcppArmadillo)]]
    
    using namespace Rcpp;
    using namespace arma;
    
    // [[Rcpp::export]]
    arama::mat A_matvecprod_elwise(const arma::mat & X, const arma::vec & y){
      int k = X.n_cols ;
      arma::mat Y = repmat(y, 1, k) ;  // 
      arma::mat out = X % Y;  
      return out;
    }
    

    as you're doing an additional conversion in and out (though the wrap() gets added by the glue code). The const & is notional (as you learned via your last question, a SEXP is a pointer object that is lightweight to copy) but better style.

    You didn't show your benchmark results so I can't comment on the effect of matrix size etc pp. I suspect you might get better answers on rcpp-devel than here. Your pick.

    Edit: If you really want something cheap and fast, I would just do this:

    // [[Rcpp::export]]
    mat cheapHadamard(mat X, vec y) {
        // should row dim of X versus length of Y here
        for (unsigned int i=0; i

    which allocates no new memory and will hence be faster, and probably be competitive with R.

    Test output:

    R> cheapHadamard(testmat, testvec)
         [,1] [,2] [,3]
    [1,]    1    4    7
    [2,]    4   10   16
    [3,]    9   18   27
    R> 
    

提交回复
热议问题