我很惊讶,没有人曾试图剖析了上述建议的方法的结果,所以我这样做。我用一个统一的随机函数生成一个列表,并使用提供重复(就在信封类型基准的简单回):
> 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