R中计算大矩阵逆的最快方法

Fastest way in R to compute the inverse for large matrices

我需要计算一个帽矩阵(来自线性回归)。标准 R 代码为:

H <- tcrossprod(tcrossprod(X, solve(crossprod(X))), X)

其中X是一个比较大的矩阵(即1e5*100),这条线要运行几千次。我知道最受限制的部分是逆计算,但叉积也可能很耗时。有没有更快的替代方法来执行这些矩阵运算?我尝试了 Rcpp 并查看了几篇文章,但我测试的任何替代方案都比较慢。也许我没有正确编写我的 C++ 代码,因为我不是高级 C++ 程序员。

谢谢!

逐行追逐此代码有点困难,因为 R 代码的设置有点复杂。但请继续阅读下面的指示。

重要的是这个话题已经被讨论了很多次:发生的事情是 R 将它发送到 BLAS (Basic Linear Algebra Subprogram) and LAPACK (Linear Algebra PACKage) 库。其中包含 人类 已知的最有效的代码。一般来说,你不能通过重写来获得它。

一个人可以通过将一个 BLAS/LAPACK 实现换成另一个实现来获得性能差异——网上也有很多很多帖子。 R本身带有已知正确但最慢的so-called 'reference BLAS'。您可以切换到 Atlas、OpenBLAS、MKL 等,具体取决于您的操作系统;有关如何执行此操作的说明在您的安装随附的一些 R manuals 中。

为了完整性,每个文件 src/main/names.c 命令 %*%crossprodtcrossprod 都引用 do_matprod。这是在文件 src/main/array.c 中,并且对参数类型进行了大量的参数检查、排列和分支,但是 例如 一个路径然后调用

F77_CALL(dsyrk)(uplo, trans, &nc, &nr, &one, x, &nr, &zero, z, &nc
        FCONE FCONE); 

this LAPACK function。对于所有其他人来说,它本质上是相同的,因此这不太可能成为您优化的场所。