fork download
  1.  
  2. library(microbenchmark)
  3.  
  4. generate_random_variables <- function(n, p){
  5. set.seed(100)
  6. matrix(rnorm(n*p), p, n)
  7. }
  8.  
  9. for_loop <- function(X) {
  10. alpha <- matrix(NA, nrow(X), nrow(X))
  11. for (i in seq_len(nrow(X))) {
  12. for (j in seq(i, nrow(X))) {
  13. alpha[i, j] <- alpha[j, i] <- var(X[i,], X[j,])
  14. }
  15. }
  16. alpha
  17. }
  18. for_loop(generate_random_variables(20, 3))
  19.  
  20. apply_func <- function(X) {
  21. ind <- expand.grid(1:nrow(X), 1:nrow(X))
  22. matrix(
  23. apply(
  24. ind,
  25. 1,
  26. function(k) var(X[k[1], ], X[k[2], ])
  27. ),
  28. nrow = nrow(X)
  29. )
  30. }
  31. apply_func(generate_random_variables(20, 3))
  32.  
  33. diag_method <- function(X) {
  34. res1 <- matrix(data = NA_real_, nrow = nrow(X), ncol = nrow(X))
  35. diag(res1) <- apply(X, 1, var)
  36. res1[lower.tri(res1)] <-
  37. combn(1:nrow(X), 2) %>%
  38. apply(2, function(k){
  39. var(X[k[1], ], X[k[2], ])
  40. })
  41. res1[upper.tri(res1)] <- res1 %>% t %>% .[upper.tri(.)]
  42. res1
  43. }
  44. diag_method(generate_random_variables(20, 3))
  45.  
  46. # var(x, y) = sum_i (X_i - X_bar) (Y_i - Y_bar)
  47. formula_calc <- function(X) {
  48. temp <- sweep(X, 1, rowMeans(X), `-`)
  49. temp %*% t(temp) / (ncol(X)-1)
  50. }
  51. formula_calc(generate_random_variables(20, 3))
  52.  
  53. microbenchmark(
  54. for_loop(generate_random_variables(20000, 50)),
  55. apply_func(generate_random_variables(20000, 50)),
  56. diag_method(generate_random_variables(20000, 50)),
  57. formula_calc(generate_random_variables(20000, 50)),
  58. var(t(generate_random_variables(20000, 50))),
  59. times = 20L
  60. )
  61. # Unit: milliseconds
  62. # expr min lq mean median uq max
  63. # for_loop 791.3887 814.2140 876.8024 872.5140 907.3111 1071.6495
  64. # apply_func 1486.9081 1542.1674 1607.6525 1592.6940 1664.5603 1796.9124
  65. # diag_method 802.1050 825.0755 938.7255 888.7893 973.0518 1453.5382
  66. # formula_calc 105.0659 110.9181 133.3554 118.8704 140.6495 249.5756
  67. # var 122.8382 124.8452 125.7241 125.1085 126.3662 130.1424
  68.  
Success #stdin #stdout #stderr 0.25s 39688KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error in library(microbenchmark) : 
  there is no package called ‘microbenchmark’
Execution halted