Здесь слияние вашего кода с примером в галерее Rcpp :
#include <Rcpp.h>
using namespace Rcpp; // shorthand
// [[Rcpp::export]]
NumericMatrix gibbsC(int n, double mu1, double mu2, double s1, double s2, double rho) {
NumericMatrix mat(n, 2);
double x=R::rnorm(mu1, s1); //init value for x_0
double y=0.0;
for (int i=0; i < n; ++i) {
y = R::rnorm(mu2 + (s2 / s1) * rho * (x - mu1),
sqrt(1.0 - rho * rho) * s2); // Y|X
x = R::rnorm(mu1 + (s1 / s2) * rho * (y - mu2),
sqrt(1.0 - rho * rho) * s1); // X|Y
mat(i,0) = x;
mat(i,1) = y;
}
return mat; // Return to R
}
/*** R
gibbsR <- function(n,mu1,mu2,s1,s2,rho){
X <- numeric() ; Y <- numeric()
X[1] <- rnorm(1,mu1,s1) #init value for x_0
for(i in 1:n){
Y[i] <- rnorm(1,mu2+(s2/s1)*rho*(X[i]-mu1),sqrt((1-rho^2)*s2^2)) # Y|X
X[i+1] <- rnorm(1,mu1+(s1/s2)*rho*(Y[i]-mu2),sqrt((1-rho^2)*s1^2)) # X|Y
}
cbind(x=X[-1],y=Y)}
set.seed(42)
system.time(resR <- gibbsR(n=1000000,mu1=170,mu2=70,s1=10,s2=5,rho=0.8))
head(resR)
set.seed(42)
system.time(resC <- gibbsC(n=1000000,mu1=170,mu2=70,s1=10,s2=5,rho=0.8))
head(resC)
*/
Обратите внимание, что многие вычисления, выполняемые на каждом этапе, на самом деле являются статическими и могут быть выполнены до цикла. Когда я получаю этот файл, я получаю в качестве вывода:
> Rcpp::sourceCpp('gibbsC.cpp')
> gibbsR <- function(n,mu1,mu2,s1,s2,rho){
+ X <- numeric() ; Y <- numeric()
+ X[1] <- rnorm(1,mu1,s1) #init value for x_0
+ for(i in 1:n){
+ .... [TRUNCATED]
> set.seed(42)
> system.time(resR <- gibbsR(n=1000000,mu1=170,mu2=70,s1=10,s2=5,rho=0.8))
user system elapsed
6.221 0.015 6.237
> head(resR)
x y
[1,] 178.2424 73.78974
[2,] 180.7385 75.19553
[3,] 185.4323 73.97701
[4,] 191.5329 75.88896
[5,] 191.3092 78.42501
[6,] 186.2806 85.38363
> set.seed(42)
> system.time(resC <- gibbsC(n=1000000,mu1=170,mu2=70,s1=10,s2=5,rho=0.8))
user system elapsed
0.162 0.004 0.166
> head(resC)
[,1] [,2]
[1,] 178.2424 73.78974
[2,] 180.7385 75.19553
[3,] 185.4323 73.97701
[4,] 191.5329 75.88896
[5,] 191.3092 78.42501
[6,] 186.2806 85.38363
Обратите внимание, что в вашем C ++-коде была небольшая ошибка, связанная с круглыми скобками:
sqrt(1-pow(rho,2))*pow(s2,2)
^ ^