다 변수 (cholesky, svd 등)를 근사화하고 Eigen (RccpEigen) 또는 Armadillo (RcppArmadillo 사용)를 사용하여 프로그래밍하는 좋은 알고리즘을 찾지 못하면 Rcpp가 도움이되는지 확신 할 수 없습니다.
가 여기에 콜레의 분해를 사용하여 하나의 방법이다 (Rcpp) 아르마 이제
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
using namespace arma;
using namespace Rcpp;
mat mvrnormArma(int n, mat sigma) {
int ncols = sigma.n_cols;
mat Y = randn(n, ncols);
return Y * chol(sigma);
}
everythings이
sigma <- matrix(c(1, 0.9, -0.3, 0.9, 1, -0.4, -0.3, -0.4, 1), ncol = 3)
cor(mvrnormR(100, sigma))
cor(MASS::mvrnorm(100, mu = rep(0, 3), sigma))
cor(mvrnormArma(100, sigma))
를 작업하는 경우 또한 확인할 수 있습니다 순수 R
mvrnormR <- function(n, sigma) {
ncols <- ncol(sigma)
matrix(rnorm(n * ncols), ncol = ncols) %*% chol(sigma)
}
의 원래 구현
이제 벤치마킹하자
require(bencharmk)
benchmark(mvrnormR(1e4, sigma),
MASS::mvrnorm(1e4, mu = rep(0, 3), sigma),
mvrnormArma(1e4, sigma),
columns=c('test', 'replications', 'relative', 'elapsed'))
## 2 MASS::mvrnorm(10000, mu = rep(0, 3), sigma) 100
## 3 mvrnormArma(10000, sigma) 100
## 1 mvrnormR(10000, sigma) 100
## relative elapsed
## 2 3.135 2.295
## 3 1.000 0.732
## 1 1.807 1.323
이 예제에서는 단위 분산 및 널 평균을 사용하는 정규 분포를 사용했지만 사용자 정의 평균 및 분산을 사용하여 쉽게 가우스 분포로 일반화 할 수있었습니다.
희망이 있습니다.
좋은 답변, +1. Rcpp 갤러리 (gallery.rcpp.org)에 이것을 작성 하시겠습니까? –
@DirkEddelbuettel 고마워요 .. 네, Rcpp 갤러리에 기여하는 것은 대단히 기쁩니다. github repos를 포크하고 풀 요청을 제출합니다. – dickoa
마크 업을 사용한 .Rmd 또는 .cpp 파일의 단순한 파일도 괜찮지 만 공식적으로 그리고 긴 방법을 선택하십시오. –