library(microbenchmark)
generate_random_variables <- function(n, p){
set.seed(100)
matrix(rnorm(n*p), p, n)
}
for_loop <- function(X) {
alpha <- matrix(NA, nrow(X), nrow(X))
for (i in seq_len(nrow(X))) {
for (j in seq(i, nrow(X))) {
alpha[i, j] <- alpha[j, i] <- var(X[i,], X[j,])
}
}
alpha
}
for_loop(generate_random_variables(20, 3))
apply_func <- function(X) {
ind <- expand.grid(1:nrow(X), 1:nrow(X))
matrix(
apply(
ind,
1,
function(k) var(X[k[1], ], X[k[2], ])
),
nrow = nrow(X)
)
}
apply_func(generate_random_variables(20, 3))
diag_method <- function(X) {
res1 <- matrix(data = NA_real_, nrow = nrow(X), ncol = nrow(X))
diag(res1) <- apply(X, 1, var)
res1[lower.tri(res1)] <-
combn(1:nrow(X), 2) %>%
apply(2, function(k){
var(X[k[1], ], X[k[2], ])
})
res1[upper.tri(res1)] <- res1 %>% t %>% .[upper.tri(.)]
res1
}
diag_method(generate_random_variables(20, 3))
# var(x, y) = sum_i (X_i - X_bar) (Y_i - Y_bar)
formula_calc <- function(X) {
temp <- sweep(X, 1, rowMeans(X), `-`)
temp %*% t(temp) / (ncol(X)-1)
}
formula_calc(generate_random_variables(20, 3))
microbenchmark(
for_loop(generate_random_variables(20000, 50)),
apply_func(generate_random_variables(20000, 50)),
diag_method(generate_random_variables(20000, 50)),
formula_calc(generate_random_variables(20000, 50)),
var(t(generate_random_variables(20000, 50))),
times = 20L
)
# Unit: milliseconds
# expr min lq mean median uq max
# for_loop 791.3887 814.2140 876.8024 872.5140 907.3111 1071.6495
# apply_func 1486.9081 1542.1674 1607.6525 1592.6940 1664.5603 1796.9124
# diag_method 802.1050 825.0755 938.7255 888.7893 973.0518 1453.5382
# formula_calc 105.0659 110.9181 133.3554 118.8704 140.6495 249.5756
# var 122.8382 124.8452 125.7241 125.1085 126.3662 130.1424
CmxpYnJhcnkobWljcm9iZW5jaG1hcmspCgpnZW5lcmF0ZV9yYW5kb21fdmFyaWFibGVzIDwtIGZ1bmN0aW9uKG4sIHApewogIHNldC5zZWVkKDEwMCkKICBtYXRyaXgocm5vcm0obipwKSwgcCwgbikKfQoKZm9yX2xvb3AgPC0gZnVuY3Rpb24oWCkgewogIGFscGhhIDwtIG1hdHJpeChOQSwgbnJvdyhYKSwgbnJvdyhYKSkKICBmb3IgKGkgaW4gc2VxX2xlbihucm93KFgpKSkgewogICAgZm9yIChqIGluIHNlcShpLCBucm93KFgpKSkgewogICAgICBhbHBoYVtpLCBqXSA8LSBhbHBoYVtqLCBpXSA8LSB2YXIoWFtpLF0sIFhbaixdKQogICAgfQogIH0KICBhbHBoYQp9CmZvcl9sb29wKGdlbmVyYXRlX3JhbmRvbV92YXJpYWJsZXMoMjAsIDMpKQoKYXBwbHlfZnVuYyA8LSBmdW5jdGlvbihYKSB7CiAgaW5kIDwtIGV4cGFuZC5ncmlkKDE6bnJvdyhYKSwgMTpucm93KFgpKQogIG1hdHJpeCgKICAgIGFwcGx5KAogICAgICBpbmQsIAogICAgICAxLAogICAgICBmdW5jdGlvbihrKSB2YXIoWFtrWzFdLCBdLCBYW2tbMl0sIF0pCiAgICApLAogICAgbnJvdyA9IG5yb3coWCkKICApCn0KYXBwbHlfZnVuYyhnZW5lcmF0ZV9yYW5kb21fdmFyaWFibGVzKDIwLCAzKSkKCmRpYWdfbWV0aG9kIDwtIGZ1bmN0aW9uKFgpIHsKICByZXMxIDwtIG1hdHJpeChkYXRhID0gTkFfcmVhbF8sIG5yb3cgPSBucm93KFgpLCBuY29sID0gbnJvdyhYKSkKICBkaWFnKHJlczEpIDwtIGFwcGx5KFgsIDEsIHZhcikKICByZXMxW2xvd2VyLnRyaShyZXMxKV0gPC0gCiAgICBjb21ibigxOm5yb3coWCksIDIpICU+JQogICAgYXBwbHkoMiwgZnVuY3Rpb24oayl7CiAgICAgIHZhcihYW2tbMV0sIF0sIFhba1syXSwgXSkKICAgIH0pCiAgcmVzMVt1cHBlci50cmkocmVzMSldIDwtIHJlczEgJT4lIHQgJT4lIC5bdXBwZXIudHJpKC4pXQogIHJlczEKfQpkaWFnX21ldGhvZChnZW5lcmF0ZV9yYW5kb21fdmFyaWFibGVzKDIwLCAzKSkKCiMgdmFyKHgsIHkpID0gc3VtX2kgKFhfaSAtIFhfYmFyKSAoWV9pIC0gWV9iYXIpCmZvcm11bGFfY2FsYyA8LSBmdW5jdGlvbihYKSB7CiAgdGVtcCA8LSBzd2VlcChYLCAxLCByb3dNZWFucyhYKSwgYC1gKQogIHRlbXAgJSolIHQodGVtcCkgLyAobmNvbChYKS0xKQp9CmZvcm11bGFfY2FsYyhnZW5lcmF0ZV9yYW5kb21fdmFyaWFibGVzKDIwLCAzKSkKCm1pY3JvYmVuY2htYXJrKAogIGZvcl9sb29wKGdlbmVyYXRlX3JhbmRvbV92YXJpYWJsZXMoMjAwMDAsIDUwKSksCiAgYXBwbHlfZnVuYyhnZW5lcmF0ZV9yYW5kb21fdmFyaWFibGVzKDIwMDAwLCA1MCkpLAogIGRpYWdfbWV0aG9kKGdlbmVyYXRlX3JhbmRvbV92YXJpYWJsZXMoMjAwMDAsIDUwKSksCiAgZm9ybXVsYV9jYWxjKGdlbmVyYXRlX3JhbmRvbV92YXJpYWJsZXMoMjAwMDAsIDUwKSksCiAgdmFyKHQoZ2VuZXJhdGVfcmFuZG9tX3ZhcmlhYmxlcygyMDAwMCwgNTApKSksCiAgdGltZXMgPSAyMEwKKQojIFVuaXQ6IG1pbGxpc2Vjb25kcwojICAgICAgICAgIGV4cHIgICAgICAgbWluICAgICAgICBscSAgICAgIG1lYW4gICAgbWVkaWFuICAgICAgICB1cSAgICAgICBtYXgKIyAgICAgIGZvcl9sb29wICA3OTEuMzg4NyAgODE0LjIxNDAgIDg3Ni44MDI0ICA4NzIuNTE0MCAgOTA3LjMxMTEgMTA3MS42NDk1CiMgICAgYXBwbHlfZnVuYyAxNDg2LjkwODEgMTU0Mi4xNjc0IDE2MDcuNjUyNSAxNTkyLjY5NDAgMTY2NC41NjAzIDE3OTYuOTEyNAojICAgZGlhZ19tZXRob2QgIDgwMi4xMDUwICA4MjUuMDc1NSAgOTM4LjcyNTUgIDg4OC43ODkzICA5NzMuMDUxOCAxNDUzLjUzODIKIyAgZm9ybXVsYV9jYWxjICAxMDUuMDY1OSAgMTEwLjkxODEgIDEzMy4zNTU0ICAxMTguODcwNCAgMTQwLjY0OTUgIDI0OS41NzU2CiMgICAgICAgICAgIHZhciAgMTIyLjgzODIgIDEyNC44NDUyICAxMjUuNzI0MSAgMTI1LjEwODUgIDEyNi4zNjYyICAxMzAuMTQyNAo=