Ich war überrascht, dass niemand versucht hatte, für die oben vorgeschlagenen Methoden die Ergebnisse Profilierung, so habe ich getan. Ich habe eine zufällige einheitliche Funktion verwendet, um eine Liste zu erzeugen und verwendet, dass für die Wiederholung (nur eine einfache Rückseite des Hüllkurventyp in der Benchmark):
> 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
Es scheint, dass die Macht zu übernehmen und dann manuell sqrt ist schneller als die eingebaute norm
für reale Werte Vektoren mindestens. Dies ist wahrscheinlich, weil Norm intern funktioniert ein 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))
}
und die SVD-Funktion intern wandelt den Vektor in eine Matrix, und tut kompliziertere Sachen:
> svd
function (x, nu = min(n, p), nv = min(n, p), LINPACK = FALSE)
{
x <- as.matrix(x)
...
„Norm“ ist nicht ganz das, was Sie denken, es ist. Versuchen Sie 'sqrt (sum (x^2))'. R macht "was du erwartest". "Norm" und "Dist" sind so konzipiert, dass sie generalisierte Entfernungsberechnungen zwischen Zeilen einer Matrix bereitstellen. –
Dies gibt einen Vektor mit den Quadratwurzeln jeder Komponente zum Quadrat zurück, also * 1 2 3 * anstelle der euklidischen Norm – runlevel0