Me sorprendió que nadie había intentado perfilar los resultados de los métodos sugeridos por encima, por lo que lo hice. He utilizado una función aleatoria uniforme para generar una lista y se utiliza para que la repetición (Sólo un simple regreso del tipo dotación de referencia):
> uut <- lapply(1:100000, function(x) {runif(1000, min=-10^10, max=10^10)})
> norm_vec <- function(x) sqrt(sum(x^2))
> norm_vec2 <- function(x){sqrt(crossprod(x))}
>
> system.time(lapply(uut, norm_vec))
user system elapsed
0.58 0.00 0.58
> system.time(lapply(uut, norm_vec2))
user system elapsed
0.35 0.00 0.34
> system.time(lapply(uut, norm, type="2"))
user system elapsed
6.75 0.00 6.78
> system.time(lapply(lapply(uut, as.matrix), norm))
user system elapsed
2.70 0.00 2.73
parece que teniendo el poder y luego manualmente sqrt es más rápido que el built-in norm
para vectores de valores reales al menos. Esto es probablemente debido a que la norma hace internamente un SVD:
> norm
function (x, type = c("O", "I", "F", "M", "2"))
{
if (identical("2", type)) {
svd(x, nu = 0L, nv = 0L)$d[1L]
}
else .Internal(La_dlange(x, type))
}
y la función SVD convierte internamente el vector en una matriz, y lo hace más complicado cosas:
> svd
function (x, nu = min(n, p), nv = min(n, p), LINPACK = FALSE)
{
x <- as.matrix(x)
...
"norma" no es exactamente lo que usted piensa es. Pruebe 'sqrt (sum (x^2))'. R hace "lo que esperas". 'norma' y' dist' están diseñados para proporcionar cálculos de distancia generalizados entre las filas de una matriz. –
Esto devuelve un vector con las raíces cuadradas de cada uno de los componentes al cuadrado, por lo tanto * 1 2 3 * en lugar de la Norma Euclidiana – runlevel0