gpt4 book ai didi

r - 使用 `sourceCpp` 编译 `fastLm`

转载 作者:行者123 更新时间:2023-12-04 17:37:33 27 4
gpt4 key购买 nike

我开始玩 Rcpp并想使用 fastLm作为一个例子(也因为它对潜在的后续工作很有用)。我知道fastLmRcppArmadillo 的一部分包,但我想使用 sourceCpp 编译它.代码可以在here中找到并且也在下面。
我遇到的第一个问题是我不能简单地运行sourceCpp("fastLm.cpp")在 R 中安装和加载后 RcppRcppArmadillo .我收到此错误 error: RcppArmadillo.h: No such file or directory然后是各种各样的事情,我想由此而来。

第二个问题是我认为我需要更改fastLm.cpp 中的一些内容。 .我的更改也在下面,但我确定缺少某些内容或错误。我包括了 #include <Rcpp.h>using namespace Rcpp;// [[Rcpp::export]]将函数导出到 R,我更改了参数 SEXPNumericVectorNumericMatrix .我不明白为什么这不起作用,并且可能对返回值进行类似的调整?

fastLm.cpp

#include <RcppArmadillo.h>

extern "C" SEXP fastLm(SEXP ys, SEXP Xs) {

Rcpp::NumericVector yr(ys); // creates Rcpp vector from SEXP
Rcpp::NumericMatrix Xr(Xs); // creates Rcpp matrix from SEXP
int n = Xr.nrow(), k = Xr.ncol();

arma::mat X(Xr.begin(), n, k, false); // reuses memory and avoids extra copy
arma::colvec y(yr.begin(), yr.size(), false);

arma::colvec coef = arma::solve(X, y); // fit model y ~ X
arma::colvec resid = y - X*coef; // residuals

double sig2 = arma::as_scalar( arma::trans(resid)*resid/(n-k) );
// std.error of estimate
arma::colvec stderrest = arma::sqrt( sig2 * arma::diagvec( arma::inv(arma::trans(X)*X)) );

return Rcpp::List::create(
Rcpp::Named("coefficients") = coef,
Rcpp::Named("stderr") = stderrest
) ;

}

fastLm.cpp 已更改
#include <Rcpp.h>
#include <RcppArmadillo.h>
using namespace Rcpp;

// [[Rcpp::export]]
extern "C" SEXP fastLm(NumericVector yr, NumericMatrix Xr) {

int n = Xr.nrow(), k = Xr.ncol();

arma::mat X(Xr.begin(), n, k, false); // reuses memory and avoids extra copy
arma::colvec y(yr.begin(), yr.size(), false);

arma::colvec coef = arma::solve(X, y); // fit model y ~ X
arma::colvec resid = y - X*coef; // residuals

double sig2 = arma::as_scalar( arma::trans(resid)*resid/(n-k) );
// std.error of estimate
arma::colvec stderrest = arma::sqrt( sig2 * arma::diagvec( arma::inv(arma::trans(X)*X)) );

return Rcpp::List::create(
Rcpp::Named("coefficients") = coef,
Rcpp::Named("stderr") = stderrest
) ;

}

最佳答案

您需要指明对 RcppArmadillo 的依赖与 Rcpp::depends伪属性。这将负责查找 RcppArmadillo标题和链接针对 blas , lapack等等 ...

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;

// [[Rcpp::export]]
List fastLm(NumericVector yr, NumericMatrix Xr) {

int n = Xr.nrow(), k = Xr.ncol();

arma::mat X(Xr.begin(), n, k, false); // reuses memory and avoids extra copy
arma::colvec y(yr.begin(), yr.size(), false);

arma::colvec coef = arma::solve(X, y); // fit model y ~ X
arma::colvec resid = y - X*coef; // residuals

double sig2 = arma::as_scalar( arma::trans(resid)*resid/(n-k) );
// std.error of estimate
arma::colvec stderrest = arma::sqrt( sig2 * arma::diagvec( arma::inv(arma::trans(X)*X)) );

return Rcpp::List::create(
Rcpp::Named("coefficients") = coef,
Rcpp::Named("stderr") = stderrest
) ;

}

此外,使用 #include <RcppArmadillo.h> 非常重要。而不是 #include <Rcpp.h> . RcppArmadillo.h照顾包括 Rcpp.h 在正确的时间 , 并且包含文件的顺序在这里非常重要。

此外,您可以返回 List并删除 extern "C" .

关于r - 使用 `sourceCpp` 编译 `fastLm`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13678098/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com