在矩阵中规范向量的最快方法

时间:2015-02-17 12:36:22

标签: 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,我不是基准测试方面的专家)。但到目前为止,我还没有找到这个问题的最终答案。有没有人对此有所了解?

感谢

1 个答案:

答案 0 :(得分:0)

这取决于矩阵的大小:

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