我需要计算一个帽子矩阵(如线性回归(。标准R代码为:
H <- tcrossprod(tcrossprod(X, solve(crossprod(X))), X)
其中X
是一个相对较大的矩阵(即1e5*100(,并且该行必须运行数千次。我知道最受限制的部分是逆计算,但叉积可能也很耗时。有没有更快的替代方案来执行这些矩阵运算?我尝试了Rcpp并查看了几篇帖子,但我测试的任何替代方案都较慢。也许我没有正确地编写我的C++代码,因为我不是一个高级C++程序员。
谢谢!
逐行查找此代码有点困难,因为R代码的设置有点复杂。但请继续阅读,下面的指针。
重要的是,这个话题已经讨论了很多次:发生的事情是,R将它发送到BLAS(基本线性代数子程序(和LAPACK(线性代数PACKage(库。其中包含人类已知的最有效的代码。一般来说,你不能通过重写来获得它。
通过将一个BLAS/LAPACK实现切换到另一个,可以获得性能差异——网上也有很多帖子。R本身带有所谓的"参考BLAS",已知它是正确的,但速度最慢。您可以切换到Atlas、OpenBLAS、MKL。。。取决于您的操作系统;有关如何执行此操作的说明,请参阅安装时附带的一些R手册。
为完整起见,对于文件src/main/names.c
,命令%*%
、crossprod
和tcrossprod
都引用do_matprod
。这在src/main/array.c文件中,对参数类型进行了大量的参数检查、排列和分支,但例如一个路径然后调用
F77_CALL(dsyrk)(uplo, trans, &nc, &nr, &one, x, &nr, &zero, z, &nc
FCONE FCONE);
这就是LAPACK函数。对于所有其他人来说,这基本上是一样的,这使得这里不太可能成为您优化的场所。