Удаление vapply из функции, чтобы ускорить его - PullRequest
0 голосов
/ 31 октября 2019

Я работаю над тиражированием решения из игры с тестами компьютерного языка в R (https://benchmarksgame -team.pages.debian.net / benchmarksgame / program / spectralnorm-python3-6.html ). Я очень доволен своим текущим решением, но мне интересно, есть ли способ удалить вызовы vapply из моего решения, чтобы ускорить его с помощью базовых функций R? Я пытаюсь остаться в пределах игры, более или менее.

start <- Sys.time()
eval_A <- function(i, j, u){
  ij = i + j
  sum(1.0 / (ij * (ij + 1) / 2 + i + 1) * u)
}

eval_B <- function(j, i, u){
  ij = i + j
  sum(1.0 / (ij * (ij + 1) / 2 + i + 1) * u)
}

eval_A_times_u_opt  <- function(u, z){
  vapply(1:z - 1, eval_A, FUN.VALUE = numeric(1), j = 1:z - 1, u = u)
}

eval_At_times_u_opt <- function(u, z){
  vapply(1:z - 1, eval_B, FUN.VALUE = numeric(1), i = 1:z - 1, u = u)
}

eval_AtA_times_u <- function(u, z){
  eval_At_times_u_opt(eval_A_times_u_opt(u, z), z)
}

spectral_norm <- function(z){
  n = z #command line arg
  u = rep(1, n)

  for(dummy in 1:10){
    v = eval_AtA_times_u(u, z)
    u = eval_AtA_times_u(v, z)
  }

  vv = vBv = 0
  for(i in 1:z){
    vBv = vBv + u[i] * v[i]
    vv = vv + v[i] * v[i]
  }
  sqrt(vBv/vv)
}

spectral_norm(5500)
end <- Sys.time()
end - start
...