Rcppパッケージを使用して、C ++からRへのラッピング(およびその逆)を簡単に行えるようにするのに時間を費やしました。
そして、線形代数はすでに、このようなA、十分に理解し、コード化するためのフィールドであるため、アルマジロ、テンプレート、小さなよくdocumted現在、現代、plesant、...ライブラリは、私たちの最初の拡張ラッパーの非常に自然にフィットした:RcppArmadillo。
これは、他のMCMCユーザーの注目を集めています。昨年の夏、ロチェスター大学ビジネススクールで1日の仕事をし、中西部の別の研究者に同様の調査を手伝いました。与えるRcppArmadilloに試して-それがうまく機能し、積極的に維持されている(今日新しいアルマジロのリリース1.1.4を、私は後で新しいRcppArmadilloを行います)およびサポートされています。
そして、私はこの例をとても気に入っているので、ここに、lm()
戻りの係数とstd.errorsのクイック「高速」バージョンがあります。
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
}
最後に、インラインで即時にプロトタイピングを行うことで、「コード化の時間」を短縮できます。