我很驚訝,沒有人曾試圖剖析了上述建議的方法的結果,所以我這樣做。我用一個統一的隨機函數生成一個列表,並使用提供重複(就在信封類型基準的簡單回):
> 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
似乎手動服用電源,然後再開方比快至少對於真實值向量的內建norm
。這可能是因爲規範內部做一個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))
}
和SVD功能的載體在內部轉換爲基體,並執行更復雜的東西:
> svd
function (x, nu = min(n, p), nv = min(n, p), LINPACK = FALSE)
{
x <- as.matrix(x)
...
「規範」是不是挺你在想什麼它是。嘗試'sqrt(sum(x^2))'。 R確實「你期望的是什麼」。 'norm'和'dist'被設計用來在矩陣的行之間提供廣義的距離計算。 –
這將返回一個向量,其中每個分量的平方根都是平方根,因此* 1 2 3 *代替歐幾里德準則 – runlevel0