celestialgod

randu matrix in Rcpp

Jan 15th, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 2.71 KB | None | 0 0
  1. Rcpp::sourceCpp(code = "
  2. // [[Rcpp::depends(RcppBlaze)]]
  3. // [[Rcpp::plugins(cpp11)]]
  4. #include <RcppBlaze.h>
  5. #include <random>
  6. #include <functional>
  7.  
  8. // [[Rcpp::export]]
  9. blaze::DynamicMatrix<double> rcppblaze_randu(size_t m, size_t n, double min = 0.0, double max = 1.0) {
  10.  static std::random_device rd;
  11.  static std::uniform_real_distribution<double> dist(min, max);
  12.  
  13.  blaze::DynamicMatrix<double> A(m, n);
  14.  for( size_t i=0UL; i<A.columns(); ++i)
  15.    std::generate(A.begin(i), A.end(i), std::bind(dist, std::default_random_engine( rd() ) ) );
  16.  return A;
  17. }")
  18.  
  19. Rcpp::sourceCpp(code = "
  20. // [[Rcpp::depends(RcppBlaze)]]
  21. // [[Rcpp::plugins(cpp11,openmp)]]
  22. #include <RcppBlaze.h>
  23. #include <random>
  24. #include <functional>
  25.  
  26. // [[Rcpp::export]]
  27. blaze::DynamicMatrix<double> rcppblaze_randu_omp(size_t m, size_t n, double min = 0.0, double max = 1.0) {
  28.  blaze::setNumThreads( blaze::getNumThreads() );
  29.  static std::random_device rd;
  30.  static std::uniform_real_distribution<double> dist(min, max);
  31.  
  32.  blaze::DynamicMatrix<double> A(m, n);
  33.  #pragma omp parallel for
  34.  for( size_t i=0UL; i<A.columns(); ++i)
  35.    std::generate(A.begin(i), A.end(i), std::bind(dist, std::default_random_engine( rd() ) ) );
  36.  return A;
  37. }")
  38.  
  39. Rcpp::sourceCpp(code = "
  40. // [[Rcpp::depends(RcppArmadillo)]]
  41. #include <RcppArmadillo.h>
  42.  
  43. // [[Rcpp::export]]
  44. arma::mat rcpparma_randu(arma::uword m, arma::uword n, double min = 0.0, double max = 1.0) {
  45.  return arma::randu<arma::mat>(m, n) * (max - min) + min;
  46. }")
  47.  
  48. Rcpp::sourceCpp(code = "
  49. // [[Rcpp::depends(RcppEigen)]]
  50. // [[Rcpp::plugins(cpp11)]]
  51. #include <RcppEigen.h>
  52.  
  53. // [[Rcpp::export]]
  54. Eigen::MatrixXd rcppeigen_randu(std::size_t m, std::size_t n, double min = 0.0, double max = 1.0) {
  55.  Eigen::MatrixXd A = Eigen::MatrixXd::Random(m, n).cwiseAbs() * (max - min);
  56.  A.array() += min;
  57.  return A;
  58. }")
  59.  
  60. library(microbenchmark)
  61. nn <- 3e3L
  62. microbenchmark(rcppblaze = rcppblaze_randu(nn, nn, -5, 5),
  63.                rcppblaze_omp = rcppblaze_randu_omp(nn, nn, -5, 5),
  64.                rcpparma = rcpparma_randu(nn, nn, -5, 5),
  65.                rcppeigen = rcppeigen_randu(nn, nn, -5, 5),
  66.                r = matrix(runif(nn*nn), nn)* 10 - 5,
  67.                times = 20L)
  68. # Unit: milliseconds
  69. #           expr       min        lq      mean    median        uq       max neval
  70. #      rcppblaze 116.73880 117.48573 124.39618 120.20502 130.55786 144.13320    20
  71. #  rcppblaze_omp  45.54567  49.05225  55.64187  51.51919  64.37526  75.13228    20
  72. #       rcpparma 128.17825 128.81605 138.73946 131.21512 146.11872 200.86437    20
  73. #      rcppeigen 179.56535 183.39844 190.49903 185.19832 197.97525 208.82546    20
  74. #              r 273.87377 285.63416 292.84457 289.33341 297.28060 351.80331    20
Add Comment
Please, Sign In to add comment