Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # RAM超過6GB,才可以run!!
- # 否則請更改矩陣大小(mat_size)或是列表的長度(length_list)
- length_list <- 30
- mat_size <- c(3000, 3000)
- mat <- matrix(rnorm(prod(mat_size)), mat_size[1], mat_size[2])
- mat.list <- lapply(1:length_list, function(i) mat)
- res1 <- function(){
- mat_sum <- matrix(rep(0, prod(mat_size)), mat_size[1], mat_size[2])
- for (i in 1:length_list){
- mat_sum <- mat_sum + mat.list[[i]]
- }
- mat_sum
- }
- res2 <- function() Reduce('+', mat.list)
- res3 <- function() matrix(rowSums(matrix(unlist(mat.list), nrow=prod(mat_size))), nrow=mat_size[1])
- res4 <- function() matrix(colSums(do.call(rbind, lapply(mat.list, as.vector))), nrow=mat_size[1])
- res5 <- function() matrix(rowSums(do.call(cbind, lapply(mat.list, as.vector))), nrow=mat_size[1])
- library(Rcpp)
- library(RcppArmadillo)
- sourceCpp(code = '
- // [[Rcpp::depends(RcppArmadillo)]]
- #include <RcppArmadillo.h>
- using namespace Rcpp;
- using namespace arma;
- // [[Rcpp::export]]
- mat list_mat_sum_f(List data_list){
- int n = data_list.size();
- SEXP mat1 = data_list[0];
- NumericMatrix mat1_rmat(mat1);
- mat result_mat(mat1_rmat.begin(), mat1_rmat.nrow(), mat1_rmat.ncol());
- for(int i = 1; i < n; i++) {
- SEXP tmp_m = data_list[i];
- NumericMatrix data_m(tmp_m);
- mat working_m(data_m.begin(), data_m.nrow(), data_m.ncol(), false);
- result_mat += working_m;
- }
- return result_mat;
- }')
- res6 <- function() list_mat_sum_f(mat.list)
- # cmpfun
- library(compiler)
- res1_cmp <- cmpfun(res1)
- res2_cmp <- cmpfun(res2)
- res3_cmp <- cmpfun(res3)
- res4_cmp <- cmpfun(res4)
- res5_cmp <- cmpfun(res5)
- all.equal(tmp <- res1(), res2())
- # TRUE
- all.equal(tmp, res3())
- # TRUE
- all.equal(tmp, res4())
- # TRUE
- all.equal(tmp, res5())
- # TRUE
- all.equal(tmp, res6())
- # TRUE
- library(microbenchmark)
- microbenchmark(res1(),res2(),res3(),res4(),res5(),res6(),
- res1_cmp(),res2_cmp(),res3_cmp(),res4_cmp(),res5_cmp(),
- times = 20)
- # Unit: milliseconds
- # expr min lq mean median uq max neval
- # res1() 446.3391 597.8725 783.2508 862.2031 964.0379 1033.5585 20
- # res2() 402.5949 466.2898 570.2002 508.7840 611.2877 876.8133 20
- # res3() 2134.7643 2225.5092 2305.0105 2310.8695 2373.2789 2454.5463 20
- # res4() 2434.3700 2558.5332 2760.0291 2825.5692 2926.9820 3104.8740 20
- # res5() 1641.4066 1822.6534 2022.1378 2087.0276 2168.8398 2392.9408 20
- # res6() 265.8707 281.7982 294.2491 286.9239 296.3758 384.0111 20
- # res1_cmp() 442.7341 651.8927 754.0913 770.4271 861.9162 973.8377 20
- # res2_cmp() 395.7517 457.7643 528.6478 472.3783 527.4379 873.7846 20
- # res3_cmp() 1932.8973 2156.7042 2244.6550 2274.8265 2341.0351 2469.4029 20
- # res4_cmp() 2442.3234 2748.4403 2836.7386 2874.3035 2963.9890 3117.3893 20
- # res5_cmp() 1655.1716 1976.7308 2061.0744 2086.4023 2194.5759 2248.9206 20
Advertisement
Add Comment
Please, Sign In to add comment