如果您愿意使用 Rcpp 及其相关软件包,现有示例fastLm()
将向您展示如何使用
- 通过 RcppEigen 的特征
- 犰狳通过 RcppArmadillo
- 通过 RcppGSL 的 GSL
后两者将使用与 R 相同的 BLAS,并且 Eigen 有一些内部的东西,通常可以更快。所有的包都lm()
使用语言提供的分解来实现(通常使用solve或related,但是一旦你有工具链为你工作,切换到SVD就很简单了)。
编辑: 这是一个明确的例子。使用以下 C++ 代码:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec getEigen(arma::mat M) {
return arma::eig_sym(M);
}
保存在文件“eigenEx.cpp”中。然后只需要这个 R 代码:
library(Rcpp) ## recent version for sourceCpp()
sourceCpp("eigenEx.cpp") ## converts source file into getEigen() we can call
这样我们就可以运行它:
set.seed(42)
X <- matrix(rnorm(3*3), 3, 3)
Z <- X %*% t(X)
getEigen(Z) ## calls function created above
我得到了与 R 完全相同的特征向量。它真的没有变得容易得多。
它还让犰狳选择用于特征分解的方法,正如大卫暗示的那样,这比成熟的 SVD 更快(参见犰狳文档)。