让R:对于对称密集矩阵乘法,任何比“tcrossprod”更快的R函数?
x = matrix(rnorm(1000000), nrow = 5000)
我想计算矩阵乘法,其转:x %*% t(x)
。
谷歌搜索后,我发现上面做的可能更快的方法是
tcrossprod(x)
而且所用的时间是
user system elapsed
2.975 0.000 2.960
是否有任何其他R-功能,可以做任务的速度比以上功能?
让R:对于对称密集矩阵乘法,任何比“tcrossprod”更快的R函数?
x = matrix(rnorm(1000000), nrow = 5000)
我想计算矩阵乘法,其转:x %*% t(x)
。
谷歌搜索后,我发现上面做的可能更快的方法是
tcrossprod(x)
而且所用的时间是
user system elapsed
2.975 0.000 2.960
是否有任何其他R-功能,可以做任务的速度比以上功能?
不,在R级这已经是最快的了。但在内部它称为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。祝你好运!
好的。感谢您的信息。 – Janak
你有没有像你的例子中的所有双打?我很少有这样的矩阵,没有零点或整数。时间显着增加与您显示的格式。 –
@PierreLafortune。我正在处理的实际矩阵是由整数和分数组成的。输出矩阵是一个协方差矩阵。 – Janak
@ZheyuanLi我想用r函数“eigen”来计算特征值和向量。 – Janak