Я работаю над тиражированием решения из игры с тестами компьютерного языка в 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