R 矩阵中赋范向量的最快方法

R 矩阵中赋范向量的最快方法,r,matrix,benchmarking,normalization,R,Matrix,Benchmarking,Normalization,我想找出得到矩阵中向量集范数的最快方法。我用的是apply这是一个例子,我的矩阵要大得多: a = matrix(1:9, 3,3) norm_a = apply(a, 1, function(x) sqrt(sum(x^2))) 但后来我想加快我的代码速度,并转向: norm_a = sqrt(a^2%*%rep(1,dim(a)[2])) 这实际上比system.time快得多,我不是基准测试方面的专家。但到目前为止,我还没有找到这个问题的最终答案。有人对此有见解吗 谢谢这取决于矩阵的大

我想找出得到矩阵中向量集范数的最快方法。我用的是apply这是一个例子,我的矩阵要大得多:

a = matrix(1:9, 3,3)
norm_a = apply(a, 1, function(x) sqrt(sum(x^2)))
但后来我想加快我的代码速度,并转向:

norm_a = sqrt(a^2%*%rep(1,dim(a)[2]))
这实际上比system.time快得多,我不是基准测试方面的专家。但到目前为止,我还没有找到这个问题的最终答案。有人对此有见解吗


谢谢

这取决于矩阵的大小:

library(microbenchmark)

microbenchmark(f1 = apply(a, 1, function(x) sqrt(sum(x^2))),
               f2 = sqrt(a^2%*%rep(1,dim(a)[2])),
               f3 = sqrt(rowSums(a^2)))
#Unit: microseconds
# expr    min     lq     mean  median      uq     max neval cld
#   f1 44.656 46.812 52.21050 47.5815 49.4295 191.248   100   c
#   f2  1.849  2.772  4.07532  4.3120  4.6210  16.323   100 a  
#   f3  6.160  7.392  9.25537  9.5480 10.1630  20.943   100  b 

set.seed(42)
b <- matrix(rnorm(1e6), 1000)

microbenchmark(f1 = apply(b, 1, function(x) sqrt(sum(x^2))),
               f2 = sqrt(b^2%*%rep(1,dim(b)[2])),
               f3 = sqrt(rowSums(b^2)))
#Unit: milliseconds
# expr       min        lq     mean     median        uq       max neval cld
#   f1 30.851752 55.513228 86.84168 109.439043 112.54796 152.27730   100   b
#   f2  5.503050  7.434152 14.36080   8.861268  10.42327  66.41539   100  a 
#   f3  4.430403  5.895553 12.92235   7.359163   8.62321  74.65256   100  a 

使用函数范数怎么样?范数是计算矩阵的范数,而不是向量集的欧几里得范数。我可以将它与apply和type=F一起使用,但它似乎与我第一次尝试使用sqrtsumx^2I的方式几乎相同。我的意思是applya,1,norm,2不一定快,只是从3种可能性中的代码更为紧凑,基于300x300矩阵,您的第二个选项是最快的,然后是第一个,然后,norm选项由microbenchmark函数、microbenchmark packageinterest结果生成,因此在任何情况下,使用f2都是保守的选择