让
x = matrix(rnorm(1000000), nrow = 5000)
我想用它的转置计算矩阵乘法:x %*% t(x)
。
谷歌搜索后我发现可能更快的方法是
tcrossprod(x)
所花的时间是
user system elapsed
2.975 0.000 2.960
是否还有其他R功能可以比上述功能更快地完成任务?
答案 0 :(得分:3)
没有。在R级,这已经是最快的。但在内部它调用了level-3 BLAS例程dsyrk
。因此,如果你能拥有一个高性能的BLAS库,那么速度会快得多。尝试将OpenBLAS与您的R链接。
链接BLAS库不需要重建R.您可以在我的问题linking R to BLAS library上阅读概述,其中包含几个链接,显示如何设置别名,然后在机器上的不同BLAS库之间切换
或者,您可以阅读我非常长的问题并回答Without root access, run R with tuned BLAS when it is linked with reference BLAS,它提供了使用外部BLAS库的各种方法,即使R链接到参考BLAS库。
作为旁注,对于维度为m * n
的矩阵,dsyrk
的FLOP计数为n * m ^ 2
。 (注意,这是tcrossprod
的计算成本。对于crossprod
,它是m * n ^ 2
。)
您有m = 5000
和n = 200
,计算需要2.96s
。因此,计算具有速度:(200 * 5000 ^ 2 / 2.96) * 1e-9 = 1.68 GFLOPs
。嗯,这是一个普通的性能水平,所以目前你肯定使用参考BLAS。使用OpenBLAS
,性能可以达到10 GFLOPs
或更高,具体取决于您的CPU。祝你好运!