J'ai une matrice de probabilités symétrique avec des entrées diagonales nulles. On suppose que quelque chose commeRcpp Rcpp vectorisée avec probabilités dans la matrice Armadillo
0 0.5 0.1 0.6
0.5 0 0.2 0.1
0.1 0.2 0 0.2
0.6 0.1 0.2 0
Je veux dessiner une matrice fictive de sorte que la probabilité de l'entrée [i, j] l'entrée [i, j] dans la matrice des probabilités. Notez que la matrice de probabilités que j'ai est une matrice de Armadillo (une grande matrice 5000x5000). bien sûr, les mannequins diagonaux devraient être nuls parce que leurs probabilités sont nulles. J'ai construit deux fonctions pour le faire mais elles ne sont pas rapides. Je devrais échantillonner cette matrice plusieurs fois dans des boucles.
mat binom1(mat& prob){
int n=prob.n_rows;
mat sample(n,n,fill::zeros);
NumericVector temp(2);
for(int i(0);i<n-1;++i){
for(int j(i+1);j<n;++j){
temp=rbinom(2,1,prob(i,j));
sample(i,j)=temp(0); sample(j,i)=temp(1);
}
}
return sample;
}
mat binom2(mat& prob){
int n=prob.n_rows;
mat sample(n,n);
for(int i(0);i<n;++i){
for(int j(0);j<n;++j){
sample(i,j)=as<double>(rbinom(1,1,prob(i,j)));
}
}
return sample;
}
Les deux sont plus lents que vectorisé rbinom R.
z=matrix(runif(1000^2),1000) #just an example for 1000x1000 matrix
microbenchmark(rbinom(nrow(z)^2,1,z),binom1(z),binom2(z))
Résultats
expr min lq mean median uq max
rbinom(nrow(z)^2, 1, z) 95.43756 95.94606 98.29283 97.5273 100.3040 108.2293
binom1(z) 131.33937 133.25487 139.75683 136.4530 139.5511 229.0484
binom2(z) 168.38226 172.60000 177.95935 175.6447 180.9531 277.3501
Y at-il un moyen de rendre plus rapidement le code?
Je vois un exemple here. Mais dans mon cas, les probabilités sont dans la matrice Armadillo
double possible de [binomiale aléatoire vectorisée CRPP tire] (https://stackoverflow.com/questions/29430726/vectorised- rcpp-random-binomial-drawers) –
J'essaie de l'utiliser mais dans mon cas les probabilités sont dans la matrice Armadillo –