我正在尝试创建一个函数,它使用Rcpp包创建一个大小为nxm的矩阵,其中包含均匀分布的条目.(我没有经验使用这个包.)
library(Rcpp)
cppFunction('NumericMatrix rngCpp(const int n,const int m) {
NumericMatrix X(n, m);
X(_,0) = runif(n);
return X;
}')
set.seed(1)
rngCpp(4,5)
[,1] [,2] [,3] [,4] [,5]
[1,] 0.2655087 0 0 0 0
[2,] 0.3721239 0 0 0 0
[3,] 0.5728534 0 0 0 0
[4,] 0.9082078 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
预期产出
set.seed(1)
matrix(runif(4*5), nrow=4, ncol = 5)
[,1] [,2] [,3] [,4] [,5]
[1,] 0.2655087 0.2016819 0.62911404 0.6870228 0.7176185
[2,] 0.3721239 0.8983897 0.06178627 0.3841037 0.9919061
[3,] 0.5728534 0.9446753 0.20597457 0.7698414 0.3800352
[4,] 0.9082078 0.6607978 0.17655675 0.4976992 0.7774452
Run Code Online (Sandbox Code Playgroud)
很好
X(_,0) = runif(n);
Run Code Online (Sandbox Code Playgroud)
您明确只分配给第一列.所以只需循环遍历所有m列,做同样的事情.
另一种(棒球内部)方式是请求n*m的向量,然后设置dim(n,m)的属性以使其成为矩阵.
相关的,IIRC是一个构造函数,它将采用该向量并重新调整它.
编辑:最后一种方法是最简单的,并且工作方式如下:
R> cppFunction('NumericMatrix mu(int n, int m) {
NumericVector v = runif(n*m);
return NumericMatrix(n, m, v.begin()); }')
R> set.seed(1); mu(4,5)
[,1] [,2] [,3] [,4] [,5]
[1,] 0.265509 0.201682 0.6291140 0.687023 0.717619
[2,] 0.372124 0.898390 0.0617863 0.384104 0.991906
[3,] 0.572853 0.944675 0.2059746 0.769841 0.380035
[4,] 0.908208 0.660798 0.1765568 0.497699 0.777445
R>
Run Code Online (Sandbox Code Playgroud)
编辑2:其他变种如F.Privé坚持争论:
我们可以添加这两个:
// [[Rcpp::export]]
NumericMatrix mu3(int n, int m) {
return NumericMatrix(n, m, runif(n*m).begin());
}
// [[Rcpp::export]]
NumericMatrix mu4(int n, int m) {
NumericVector v = runif(n * m);
v.attr("dim") = Dimension(n, m);
return as<NumericMatrix>(v);
}
Run Code Online (Sandbox Code Playgroud)
然后得到
R> N <- 1000; M <- 1000
R> microbenchmark::microbenchmark(
+ mu(N, M),
+ mu2(N, M),
+ mu3(N, M),
+ mu4(N, M),
+ rngCpp(N, M)
+ )
Unit: milliseconds
expr min lq mean median uq max neval
mu(N, M) 4.77894 4.98485 7.32315 5.18153 5.36468 33.2427 100
mu2(N, M) 3.99137 4.05308 5.43207 4.36296 4.57510 30.7335 100
mu3(N, M) 4.73176 5.01524 6.35186 5.17173 5.39541 31.7425 100
mu4(N, M) 3.99784 4.10052 4.72563 4.41176 4.60303 30.6166 100
rngCpp(N, M) 5.18726 5.60165 7.53171 5.83892 6.14315 34.5934 100
R>
Run Code Online (Sandbox Code Playgroud)