R 矩阵中赋范向量的最快方法
我想找出得到矩阵中向量集范数的最快方法。我用的是apply这是一个例子,我的矩阵要大得多: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快得多,我不是基准测试方面的专家。但到目前为止,我还没有找到这个问题的最终答案。有人对此有见解吗 谢谢这取决于矩阵的大
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都是保守的选择