私は、対角要素がヌルの確率の対称行列を持っています。アルマジロ行列の確率でベクトル化されたRcpp rbinom
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
のようなものと仮定私は、エントリの確率[I、j]は確率行列のエントリ[I、J]となるようにダミー行列を描きたいです。私が持つ確率行列はアルマジロ行列(大きな行列5000x5000)であることに注意してください。もちろん、対角線のダミーは、その確率がゼロであるため、ゼロでなければならない。私はそれを行うための2つの機能を構築しましたが、高速ではありません。私はこの行列を何度もループでサンプリングしなければならない。
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;
}
両R.
にベクトル化rbinomよりも遅いですz=matrix(runif(1000^2),1000) #just an example for 1000x1000 matrix
microbenchmark(rbinom(nrow(z)^2,1,z),binom1(z),binom2(z))
結果
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
高速なコードを作成する方法はありますか?
hereの例を参照してください。しかし、私の場合には確率がほぼ-重複答えを考えるアルマジロ行列に
可能な重複[ベクトル化Rcppランダム二項は、描画] (https://stackoverflow.com/questions/29430726/vectorised- rcpp-random-binomial-draws) –
私はそれを使用しようとしますが、私の場合、確率はアルマジロ行列にあります –