Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中计算大型矩阵逆的最快方法_R_Performance_Rcpp_Matrix Inverse_Cross Product - Fatal编程技术网

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

R中计算大型矩阵逆的最快方法,r,performance,rcpp,matrix-inverse,cross-product,R,Performance,Rcpp,Matrix Inverse,Cross Product,我需要根据线性回归计算一个hat矩阵。标准R代码为: 逐行追踪代码有点困难,因为R代码的设置有点复杂。但请继续阅读下面的指示 重要的一点是,这个主题已经讨论过很多次了:发生的事情是R将其发送给和库。其中包含人类已知的最有效的代码。一般来说,你不能通过重写来获得它 通过将一个BLAS/LAPACK实现切换到另一个实现,可以获得性能差异——在线上也有很多帖子。R本身带有所谓的“参考BLAS”,已知是正确的,但速度最慢。你可以切换到Atlas,OpenBLAS,MKL。。。取决于您的操作系统;有关如何

我需要根据线性回归计算一个hat矩阵。标准R代码为:


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

重要的一点是,这个主题已经讨论过很多次了:发生的事情是R将其发送给和库。其中包含人类已知的最有效的代码。一般来说,你不能通过重写来获得它

通过将一个BLAS/LAPACK实现切换到另一个实现,可以获得性能差异——在线上也有很多帖子。R本身带有所谓的“参考BLAS”,已知是正确的,但速度最慢。你可以切换到Atlas,OpenBLAS,MKL。。。取决于您的操作系统;有关如何执行此操作的说明,请参阅安装时附带的一些说明

为完整起见,每个文件src/main/names.c中的命令%*%、crossprod和tcrossprod都指向do_matprod。这在文件中,对参数类型进行大量的参数检查、排列和分支,但例如,一条路径会调用

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

是的。对于所有其他人来说,这基本上是一样的,这不太可能成为您优化的场所。

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

重要的一点是,这个主题已经讨论过很多次了:发生的事情是R将其发送给和库。其中包含人类已知的最有效的代码。一般来说,你不能通过重写来获得它

通过将一个BLAS/LAPACK实现切换到另一个实现,可以获得性能差异——在线上也有很多帖子。R本身带有所谓的“参考BLAS”,已知是正确的,但速度最慢。你可以切换到Atlas,OpenBLAS,MKL。。。取决于您的操作系统;有关如何执行此操作的说明,请参阅安装时附带的一些说明

为完整起见,每个文件src/main/names.c中的命令%*%、crossprod和tcrossprod都指向do_matprod。这在文件中,对参数类型进行大量的参数检查、排列和分支,但例如,一条路径会调用

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

是的。对于所有其他情况,这基本上是相同的,这不太可能成为您进行优化的场所。

crossprodX是一个100x100矩阵,因此解算部分是瞬时的。需要花费时间的是计算与最后的X相同的X大小。你确定这是你真正需要做的吗?之后你没有对这个矩阵做任何事情吗?例如,将其与向量相乘或得到对角线?一般评论:通过直接翻译线性代数来解决统计问题通常是错误的。例如,hat矩阵的‘hatvalues’对角线是从QR分解的结果开始在R中计算的:看看你是否需要整个hat矩阵,你不能完全使用该解决方案,但是一般的观点是,可能有更有效的线性代数可以得到你想要的…对于如何快速进行矩阵运算的一般问题?它是单线程MKL+数据并行的,例如,如果您正在进行模拟,请并行运行多个迭代。我明白了,谢谢大家的评论,也感谢@eddelbuettel对下面的响应。由于这将是R软件包的一部分,因此更改“参考爆炸”可能不是一个好办法,因为每个用户可能有不同的库。。我将尝试找到一个解决方案,不直接翻译线性代数,如本所指出的。事实上,这条线是多元线性模型中平方和叉积矩阵计算的一部分。我又问了一遍,crossprodX是一个100x100的矩阵,因此解算部分是瞬时的。需要花费时间的是计算与最后的X相同的X大小。你确定这是你真正需要做的吗?之后你没有对这个矩阵做任何事情吗?例如,将其与向量相乘或得到对角线?一般评论:通过直接翻译线性代数来解决统计问题通常是错误的。例如,hat矩阵的‘hatvalues’对角线是从QR分解的结果开始在R中计算的:看看你是否需要整个hat矩阵,你不能完全使用该解决方案,但是一般的观点是,可能有更有效的线性代数可以得到你想要的…对于如何快速进行矩阵运算的一般问题?它是单线程MKL+数据并行的,例如,如果您正在进行模拟,请并行运行多个迭代。我明白了,谢谢大家的评论,也感谢@eddelbuettel对下面的响应。由于这将是R软件包的一部分,因此更改“参考爆炸”可能不是一个好办法,因为每个用户可能有不同的库。。 我将尝试找到一个解决方案,不直接翻译线性代数,如本所指出的。事实上,这条线是多元线性模型中平方和叉积矩阵计算的一部分。我又问。