Advertisement
celestialgod

Plus matrices in a list

Dec 6th, 2019
979
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 2.89 KB | None | 0 0
  1. # RAM超過6GB,才可以run!!
  2. # 否則請更改矩陣大小(mat_size)或是列表的長度(length_list)
  3. length_list <- 30
  4. mat_size <- c(3000, 3000)
  5.  
  6. mat <- matrix(rnorm(prod(mat_size)), mat_size[1], mat_size[2])
  7. mat.list <- lapply(1:length_list, function(i) mat)
  8.  
  9. res1 <- function(){
  10.   mat_sum <- matrix(rep(0, prod(mat_size)), mat_size[1], mat_size[2])
  11.   for (i in 1:length_list){
  12.     mat_sum <- mat_sum + mat.list[[i]]
  13.   }
  14.   mat_sum
  15. }
  16. res2 <- function() Reduce('+', mat.list)
  17. res3 <- function() matrix(rowSums(matrix(unlist(mat.list), nrow=prod(mat_size))), nrow=mat_size[1])
  18. res4 <- function() matrix(colSums(do.call(rbind, lapply(mat.list, as.vector))), nrow=mat_size[1])
  19. res5 <- function() matrix(rowSums(do.call(cbind, lapply(mat.list, as.vector))), nrow=mat_size[1])
  20. library(Rcpp)
  21. library(RcppArmadillo)
  22. sourceCpp(code = '
  23. // [[Rcpp::depends(RcppArmadillo)]]
  24. #include <RcppArmadillo.h>
  25. using namespace Rcpp;
  26. using namespace arma;
  27.  
  28. // [[Rcpp::export]]
  29. mat list_mat_sum_f(List data_list){
  30. int n = data_list.size();
  31. SEXP mat1 = data_list[0];
  32. NumericMatrix mat1_rmat(mat1);
  33. mat result_mat(mat1_rmat.begin(), mat1_rmat.nrow(), mat1_rmat.ncol());
  34. for(int i = 1; i < n; i++) {
  35.   SEXP tmp_m = data_list[i];
  36.   NumericMatrix data_m(tmp_m);
  37.   mat working_m(data_m.begin(), data_m.nrow(), data_m.ncol(), false);
  38.   result_mat += working_m;
  39. }
  40. return result_mat;
  41. }')
  42. res6 <- function() list_mat_sum_f(mat.list)
  43.  
  44. # cmpfun
  45. library(compiler)
  46. res1_cmp <- cmpfun(res1)
  47. res2_cmp <- cmpfun(res2)
  48. res3_cmp <- cmpfun(res3)
  49. res4_cmp <- cmpfun(res4)
  50. res5_cmp <- cmpfun(res5)
  51.  
  52. all.equal(tmp <- res1(), res2())
  53. # TRUE
  54. all.equal(tmp, res3())
  55. # TRUE
  56. all.equal(tmp, res4())
  57. # TRUE
  58. all.equal(tmp, res5())
  59. # TRUE
  60. all.equal(tmp, res6())
  61. # TRUE
  62.  
  63. library(microbenchmark)
  64. microbenchmark(res1(),res2(),res3(),res4(),res5(),res6(),
  65.           res1_cmp(),res2_cmp(),res3_cmp(),res4_cmp(),res5_cmp(),
  66.           times = 20)
  67.  
  68. # Unit: milliseconds
  69. #       expr       min        lq      mean    median        uq       max neval
  70. #     res1()  446.3391  597.8725  783.2508  862.2031  964.0379 1033.5585    20
  71. #     res2()  402.5949  466.2898  570.2002  508.7840  611.2877  876.8133    20
  72. #     res3() 2134.7643 2225.5092 2305.0105 2310.8695 2373.2789 2454.5463    20
  73. #     res4() 2434.3700 2558.5332 2760.0291 2825.5692 2926.9820 3104.8740    20
  74. #     res5() 1641.4066 1822.6534 2022.1378 2087.0276 2168.8398 2392.9408    20
  75. #     res6()  265.8707  281.7982  294.2491  286.9239  296.3758  384.0111    20
  76. # res1_cmp()  442.7341  651.8927  754.0913  770.4271  861.9162  973.8377    20
  77. # res2_cmp()  395.7517  457.7643  528.6478  472.3783  527.4379  873.7846    20
  78. # res3_cmp() 1932.8973 2156.7042 2244.6550 2274.8265 2341.0351 2469.4029    20
  79. # res4_cmp() 2442.3234 2748.4403 2836.7386 2874.3035 2963.9890 3117.3893    20
  80. # res5_cmp() 1655.1716 1976.7308 2061.0744 2086.4023 2194.5759 2248.9206    20
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement