【问题标题】:Fastest way of norming vectors in a matrix在矩阵中规范向量的最快方法
【发布时间】:2015-04-18 03:47:49
【问题描述】:

我想找出获得矩阵中包含的一组向量的范数的最快方法。我使用的是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,我不是基准测试专家)。但到目前为止,我还没有找到这个问题的任何最终答案。有人对此有见解吗?

谢谢

【问题讨论】:

  • 使用norm函数怎么样?
  • norm 是计算矩阵的范数,而不是一组向量的(欧几里得)范数。我可以将它与applytype = "F" 一起使用,但这似乎与我第一次尝试使用sqrt(sum(x^2)) 时几乎相同
  • 我的意思是apply(a,1,norm,"2")(不一定更快,只是代码更简洁)
  • 根据300x300 矩阵,从3 种可能性中,您的第二个选项是最快的,然后是第一个选项,然后是norm 选项(来自microbenchmark 函数的结果,来自@ 987654334@包)

标签: r matrix benchmarking normalization


【解决方案1】:

这取决于矩阵的大小:

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 

【讨论】:

  • 有趣的结果,所以无论如何使用f2 是一个保守的选择
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多