kimsenin yukarıda önerilen yöntemleri için sonuçlar profilleme çalıştı şaşırdım, bu yüzden yaptım. Bir liste oluşturmak için rastgele bir üniforma fonksiyonu kullanılır ve tekrarı (kriter zarfının tipi için basit bir arka) için bunu kullandım:
> 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
elle ardından Sqrt Güç alarak ve daha hızlı görünüyor olduğunu Gerçek değerler için en az norm
numaralı yapı.
> 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))
}
ve SVD fonksiyonu dahili olarak bir matris içine vektör dönüştürür ve daha karmaşık şeyler yapar:
> svd
function (x, nu = min(n, p), nv = min(n, p), LINPACK = FALSE)
{
x <- as.matrix(x)
...
"norm" oldukça düşünmüyor ne norm içten bir SVD yapar Bunun nedeni muhtemelen bu. Sqrt (sum (x^2)) 'yi deneyin. R "ne bekliyorsun" diyor. “norm” ve “dist”, bir matrisin satırları arasında genelleştirilmiş mesafe hesaplamaları sağlamak için tasarlanmıştır. –
Bu, bileşenlerin her birinin karekökünü kareye bölen bir vektör döndürür, böylece * 1 2 3 * yerine Euclidean Norm – runlevel0