우리는 Rcpp 패키지 를 통해 C ++에서 R 로 래핑 하는 것이 훨씬 쉬워 졌습니다 .
그리고 선형 대수학은 이미 잘 이해되고 코딩 된 분야이기 때문에 , 현재, 현대적이고, 유쾌하고, 잘 정리되고, 작고, 템플릿 화 된, 라이브러리 인 Armadillo 는 우리의 첫 번째 확장 래퍼에 매우 적합했습니다 : RcppArmadillo .
이것은 다른 MCMC 사용자의 관심을 끌었습니다. 나는 지난 여름 로체스터 대학 경영 대학원에서 하루 동안 일을했으며 비슷한 연구를 통해 MidWest의 다른 연구원을 도왔습니다. 부여 RcppArmadillo을 시도 - 그것은 적극적으로 유지, 잘 작동 및 지원 (새 아르마 자료를 1.1.4 오늘, 나는 새로운 나중에 RcppArmadillo를 만들 것입니다).
그리고 나는이 예제를 너무 많이 좋아하기 때문에, 여기에 lm()
반환 계수와 표준 오류 의 빠른 "빠른"버전이 있습니다 .
extern "C" SEXP fastLm(SEXP ys, SEXP Xs) {
try {
Rcpp::NumericVector yr(ys); // creates Rcpp vector
Rcpp::NumericMatrix Xr(Xs); // creates Rcpp matrix
int n = Xr.nrow(), k = Xr.ncol();
arma::mat X(Xr.begin(), n, k, false); // avoids extra copy
arma::colvec y(yr.begin(), yr.size(), false);
arma::colvec coef = arma::solve(X, y); // fit model y ~ X
arma::colvec res = y - X*coef; // residuals
double s2 = std::inner_product(res.begin(), res.end(),
res.begin(), double())/(n - k);
// std.errors of coefficients
arma::colvec std_err =
arma::sqrt(s2 * arma::diagvec( arma::pinv(arma::trans(X)*X) ));
return Rcpp::List::create(Rcpp::Named("coefficients") = coef,
Rcpp::Named("stderr") = std_err,
Rcpp::Named("df") = n - k);
} catch( std::exception &ex ) {
forward_exception_to_r( ex );
} catch(...) {
::Rf_error( "c++ exception (unknown reason)" );
}
return R_NilValue; // -Wall
}
마지막으로 인라인 을 통해 즉각적인 프로토 타이핑을 통해 '코딩 시간'을 단축 할 수 있습니다.